- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我的应用程序使用 ListView
显示 url 中的一些图像和标题。但无论我做什么,图像在向上或向下滚动后都会从 ListView
中消失,并且没有人能再次看到它们。我怎样才能做到这一点?我是 Android 新手,所以我很高兴看到任何建议。
我的代码在这里:
AndroidManifest:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.forwork">
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity
android:name=".MainActivity"
android:configChanges="keyboardHidden|orientation|screenSize">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
MainActivity.java:
import android.app.Activity;
import android.content.Context;
import android.content.res.Configuration;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.os.AsyncTask;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;
import org.apache.http.HttpStatus;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.lang.ref.WeakReference;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.Objects;
import java.util.concurrent.ExecutionException;
public class MainActivity extends Activity{
public final static int SIZE=30;
public String[] titles = new String[SIZE]; //array for titles
public String[] keys = new String[SIZE]; //array for id of news
public String[] image_url = new String[SIZE]; //array for image urls to download
public String data="";
//that's for parsing
JSONObject news = null;
String title = "";
JSONObject prefs = null;
JSONObject inner = null;
JSONObject elements = null;
JSONObject image =null;
String pic = "";
JSONObject json = null;
JSONArray collection = null;
JSONObject documents = null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
if (isInternetThere(this)) //if internet is not absent
try {
ListView my_list_view = (ListView) findViewById(R.id.list_view); //custom list view
CustomList adapter = new CustomList(this,titles,image_url); //custom adapter
my_list_view.setAdapter(adapter);
Parse p = new Parse(); //instance of my async task for getting json
data = p.execute().get();
} catch (InterruptedException | ExecutionException e) {
e.printStackTrace();
}
else {
Toast.makeText(this, "No internet connection", Toast.LENGTH_LONG).show();
finish();
}
try {
json = new JSONObject(data); //parsing json
collection = json.getJSONArray("collection"); //new's ids
documents = json.getJSONObject("documents"); //new's info
for (int i=0; i<keys.length;i++){
keys[i]=collection.getString(i);
news = documents.getJSONObject(keys[i]);
title = news.getString("title"); //title
titles[i]=title; //put title into list
prefs = news.getJSONObject("prefs");
inner = prefs.getJSONObject("inner");
elements = inner.getJSONObject("elements");
image = elements.getJSONObject("image");
if (image.has("small_url")) //whether there is a picture?
pic = image.getString("small_url");
else pic = "";
image_url[i] = pic;
}
} catch (JSONException e) {
e.printStackTrace();
}
}
@Override
public void onConfigurationChanged(Configuration newConfig) { //it is just for orientation monitoring
super.onConfigurationChanged(newConfig);
if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) {
Toast.makeText(this, "landscape", Toast.LENGTH_SHORT).show();
} else if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT) {
Toast.makeText(this, "portrait", Toast.LENGTH_SHORT).show();
}
}
public class Parse extends AsyncTask<Void,Void,String> { //my async task #1 that just get a json from url
@Override
protected String doInBackground(Void... params) {
String str= null;
try {
str = readJSON();
} catch (Exception e) {
e.printStackTrace();
}
return str;
}
public String readJSON() { //function that get json
HttpURLConnection urlConnection = null;
BufferedReader reader = null;
String resultJson = ""; //this will be a string with json
try {
URL url = new URL("https://meduza.io/api/v3/search?chrono=news&page=0&per_page=30&locale=ru"); //url with 30 news
urlConnection = (HttpURLConnection) url.openConnection();
urlConnection.setRequestMethod("GET");
urlConnection.connect();
InputStream inputStream = urlConnection.getInputStream(); //stream for getting json
StringBuffer buffer = new StringBuffer(); //buffer for json saving
reader = new BufferedReader(new InputStreamReader(inputStream)); //it just reads
String line;
while ((line = reader.readLine()) != null) { //line by line..
buffer.append(line); //...and add it into buffer
}
resultJson = buffer.toString(); //result is string got from buffer
} catch (Exception e) {
e.printStackTrace();
}
return resultJson;
}
}
public class DownloadImage extends AsyncTask<String,Void,Bitmap>{ //my async task #2 for downloading image from url using Bitmap
private final WeakReference<ImageView> imgv; //it means that..
public DownloadImage(ImageView imageView){
imgv = new WeakReference<ImageView>(imageView); //the object can be deleted by garbage collector without any trubles
} //it helps to avoid memory leaks
@Override
protected Bitmap doInBackground(String... strings) {
return down_Bit(strings[0]);
}
@Override
protected void onPostExecute(Bitmap res){
if (isCancelled()){
res=null;
}
if(imgv != null){ //if the link is actual...
ImageView iv = imgv.get(); //we get it
if (iv != null){ //if the object is exists...
if (res != null) //and image exests...
iv.setImageBitmap(res); //we show it
}
}
}
private Bitmap down_Bit(String url){ //it is for downloading images
HttpURLConnection urlConnection = null;
try{
URL uri = new URL(url);
urlConnection = (HttpURLConnection) uri.openConnection();
int statusCode = urlConnection.getResponseCode();
if (statusCode != HttpStatus.SC_OK) //if our url is not right(for ex. "http" instead of "https"
return null;
InputStream is = urlConnection.getInputStream();
if (is != null){
Bitmap bitmap = BitmapFactory.decodeStream(is); //if input stream exists we get the Bitmap from it....
return bitmap; //and return it
}
} catch (Exception e){
e.printStackTrace();
} finally {
if (urlConnection != null)
urlConnection.disconnect();
}
return null;
}
}
public class CustomList extends ArrayAdapter<String>{ //that is my custom adapter named CustomList. probably for not misunderstanding
private Activity context;
private String[] item_name;
private String[] imgurl;
public CustomList(Activity context,String[] item_name, String[] imgurl){ //constructor
super(context,R.layout.my_listview_item,item_name);
this.context=context; //activity
this.item_name=item_name; //there is will be the titles
this.imgurl=imgurl; //there is will be the images
}
@Override
public int getCount(){
return item_name.length;
}
@Override
public String getItem(int position){
return item_name[position];
}
@Override
public long getItemId(int position){
return position;
}
public View getView(int position, View view, ViewGroup parent) {
LayoutInflater inflater = context.getLayoutInflater();
View rowView = inflater.inflate(R.layout.my_listview_item,null,true);
TextView txtTitle = (TextView) rowView.findViewById(R.id.txt);
if (imgurl[position] != "") { //if there is a url of an image(because there some news without it)
rowView.findViewById(R.id.img).setVisibility(View.VISIBLE); //show the picture slot
imgurl[position] = "https://meduza.io" + imgurl[position]; //and make the url absolute, not relative
new DownloadImage((ImageView) rowView.findViewById(R.id.img)).execute(imgurl[position]); //and download the picture using the absolute url
}
else
rowView.findViewById(R.id.img).setVisibility(View.GONE); //if there is no picture, just hide the slot
txtTitle.setText(item_name[position]); //it is title
return rowView;
}
}
public boolean isInternetThere(Context context) { //it is for internet connection testing
ConnectivityManager manager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo networkInfo = manager.getActiveNetworkInfo();
if (networkInfo != null && networkInfo.isConnected()) {
return true;
} else {
return false;
}
}
}
最佳答案
我认为您正在使用ListView
。在 ListView
中滚动时,Android 会重新使用列表项,因此当您滚动时图像开始消失。
因此,您需要做的第一个更改是使用 RecyclerView
而不是 ListView
。 RecyclerView
实现将强制您实现 ViewHolder
模式,这将使您的滚动体验更好!检查此列表中的 smooth scrolling.
最后,为了让您的图像根据需要工作,我建议您使用 Picasso 。这是可用的最好的图像加载库。您无需维护列表中元素的位置,图像将根据需要工作。
我建议使用一个库,因为自己实现图像加载最佳实践可能需要花费大量时间。 The best practices.您必须维护图像的缓存,有效地维护 BitMap 大小等。
希望这些要点能够指导您以最佳方式实现图像滚动列表:)干杯!
关于java - 图像在 ListView 中消失,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39816645/
我正在尝试学习 Knockout 并尝试创建一个照片 uploader 。我已成功将一些图像存储在数组中。现在我想回帖。在我的 knockout 码(Javascript)中,我这样做: 我在 Jav
我正在使用 php 编写脚本。我的典型问题是如何在 mysql 中添加一个有很多替代文本和图像的问题。想象一下有机化学中具有苯结构的描述。 最有效的方法是什么?据我所知,如果我有一个图像,我可以在数据
我在两个图像之间有一个按钮,我想将按钮居中到图像高度。有人可以帮帮我吗? Entrar
下面的代码示例可以在这里查看 - http://dev.touch-akl.com/celebtrations/ 我一直在尝试做的是在 Canvas 上绘制 2 个图像(发光,然后耀斑。这些图像的链接
请检查此https://jsfiddle.net/rhbwpn19/4/ 图像预览对于第一篇帖子工作正常,但对于其他帖子则不然。 我应该在这里改变什么? function readURL(input)
我对 Canvas 有疑问。我可以用单个图像绘制 Canvas ,但我不能用单独的图像绘制每个 Canvas 。- 如果数据只有一个图像,它工作正常,但数据有多个图像,它不工作你能帮帮我吗? va
我的问题很简单。如何获取 UIImage 的扩展类型?我只能将图像作为 UIImage 而不是它的名称。图像可以是静态的,也可以从手机图库甚至文件路径中获取。如果有人可以为此提供一点帮助,将不胜感激。
我有一个包含 67 个独立路径的 SVG 图像。 是否有任何库/教程可以为每个路径创建单独的光栅图像(例如 PNG),并可能根据路径 ID 命名它们? 最佳答案 谢谢大家。我最终使用了两个答案的组合。
我想将鼠标悬停在一张图片(音乐专辑)上,然后播放一张唱片,所以我希望它向右移动并旋转一点,当它悬停时我希望它恢复正常动画片。它已经可以向右移动,但我无法让它随之旋转。我喜欢让它尽可能简单,因为我不是编
Retina iOS 设备不显示@2X 图像,它显示 1X 图像。 我正在使用 Xcode 4.2.1 Build 4D502,该应用程序的目标是 iOS 5。 我创建了一个测试应用(主/细节)并添加
我正在尝试从头开始以 Angular 实现图像 slider ,并尝试复制 w3school基于图像 slider 。 下面我尝试用 Angular 实现,谁能指导我如何使用 Angular 实现?
我正在尝试获取图像的图像数据,其中 w= 图像宽度,h = 图像高度 for (int i = x; i imageData[pos]>0) //Taking data (here is the pr
我的网页最初通过在 javascript 中动态创建图像填充了大约 1000 个缩略图。由于权限问题,我迁移到 suPHP。现在不用标准 标签本身 我正在通过这个 php 脚本进行检索 $file
我正在尝试将 python opencv 图像转换为 QPixmap。 我按照指示显示Page Link我的代码附在下面 img = cv2.imread('test.png')[:,:,::1]/2
我试图在这个 Repository 中找出语义分割数据集的 NYU-v2 . 我很难理解图像标签是如何存储的。 例如,给定以下图像: 对应的标签图片为: 现在,如果我在 OpenCV 中打开标签图像,
import java.util.Random; class svg{ public static void main(String[] args){ String f="\"
我有一张 8x8 的图片。 (位图 - 可以更改) 我想做的是能够绘制一个形状,给定一个 Path 和 Paint 对象到我的 SurfaceView 上。 目前我所能做的就是用纯色填充形状。我怎样才
要在页面上显示图像,你需要使用源属性(src)。src 指 source 。源属性的值是图像的 URL 地址。 定义图像的语法是: 在浏览器无法载入图像时,替换文本属性告诉读者她们失去的信息。此
**MMEditing是基于PyTorch的图像&视频编辑开源工具箱,支持图像和视频超分辨率(super-resolution)、图像修复(inpainting)、图像抠图(matting)、
我正在尝试通过资源文件将图像插入到我的程序中,如下所示: green.png other files 当我尝试使用 QImage 或 QPixm
我是一名优秀的程序员,十分优秀!