Android 每次我滚动我不想要的内容时,ListView都会重新加载它的项目
我在android中创建了一个列表视图,我想做一些事情,比如每次单击列表项时,它必须在红色和绿色之间切换颜色。我能够做到这一点,但问题是每次我向上或向下滚动listview时,它都会一次又一次地重新加载列表项,并且切换的颜色会丢失 我尝试使用一个切换按钮,而不仅仅是手动调整颜色,但即使这样也会失去它的状态。当用户单击它时,它将变为打开状态,当用户向上或向下滚动时,它将失去状态并显示关闭状态 这是我的MainActivity.java文件Android 每次我滚动我不想要的内容时,ListView都会重新加载它的项目,android,listview,Android,Listview,我在android中创建了一个列表视图,我想做一些事情,比如每次单击列表项时,它必须在红色和绿色之间切换颜色。我能够做到这一点,但问题是每次我向上或向下滚动listview时,它都会一次又一次地重新加载列表项,并且切换的颜色会丢失 我尝试使用一个切换按钮,而不仅仅是手动调整颜色,但即使这样也会失去它的状态。当用户单击它时,它将变为打开状态,当用户向上或向下滚动时,它将失去状态并显示关闭状态 这是我的MainActivity.java文件 package bk.acs; import andro
package bk.acs;
import android.content.Context;
import android.graphics.Color;
import android.support.annotation.NonNull;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.text.Layout;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;
import java.util.Arrays;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
ListView listView;
final String chars[] = new String[20];
final int arr[]=new int[20];
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
for(int i=0;i<20;i++)
{
chars[i]="15BEC058"+i;
}
Arrays.fill(arr,1);
listView=(ListView)findViewById(R.id.row);
MyAdapter adapter =new MyAdapter(this,chars);
listView.setAdapter(adapter);
listView.setOnItemClickListener(new AdapterView.OnItemClickListener()
{
@Override
public void onItemClick(AdapterView adapterView, View view, int i, long l) {
arr[i]=(arr[i]==0)?(1):(0);
String res=(arr[i]==0)?("Absent"):("Present");
if(arr[i]==0)
{
view.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
view.setBackgroundColor(getResources().getColor(R.color.item_red));
}
});
}
if(arr[i]==1)
{
view.setBackgroundColor(getResources().getColor(R.color.item_green));
}
Toast.makeText(MainActivity.this, "Marked "+chars[i]+" as "+res, Toast.LENGTH_SHORT).show();
}
});
}
}
要做到这一点,您需要声明一个默认设置为false的布尔变量。单击任何特定项时,获取项的位置,并将布尔变量的值设置为true,这将帮助您获得结果。仅在适配器类上使用Viewholder for listview android设置颜色
public class MyAdapter extends BaseAdapter{
String [] result;
Context context;
int [] imageId;
private static LayoutInflater inflater=null;
public Myadapter(MainActivity mainActivity, String[] prgmNameList, int[] prgmImages) {
// TODO Auto-generated constructor stub
result=prgmNameList;
context=mainActivity;
imageId=prgmImages;
inflater = ( LayoutInflater )context.
getSystemService(Context.LAYOUT_INFLATER_SERVICE);
}
@Override
public int getCount() {
// TODO Auto-generated method stub
return result.length;
}
@Override
public Object getItem(int position) {
// TODO Auto-generated method stub
return position;
}
@Override
public long getItemId(int position) {
// TODO Auto-generated method stub
return position;
}
public class Holder
{
TextView tv_language;
ImageView im_language;
}
@Override
public View getView(final int position, View convertView, ViewGroup parent) {
// TODO Auto-generated method stub
Holder holder=new Holder();
View view;
view = inflater.inflate(R.layout.layout_language_list_item, null);
holder.tv_language=(TextView) view.findViewById(R.id.tv_language);
holder.im_language=(ImageView) view.findViewById(R.id.image);
holder.tv_language.setText(result[position]);
Picasso.with(context).load(imageId[position]).into(holder.image);
view.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
//your color change if loop should come here
}
});
return view;
}
}
上面的适配器用于listview,包含一个imageview和一个textview。您需要在onclick listener中提供颜色更改代码。我在注释中提到了位置。请参阅listview的正确实现谢谢您告诉我们您正在粘贴代码。现在,它在哪里?现在我保留了代码请查看它…澄清问题并引入外部代码。实际上我试图将代码粘贴到这里,但文本框没有粘贴完整的代码…它正在删除部分代码,所以我保留了url…默认情况下,它被设置为false,但如果您使用POJO,请建议我如何将其设置为true类来存储数据/值,然后在将数据存储到pojo类中时清除新的布尔类型变量set boolean variable false,每当您在listview中选择项时,获取项的位置并设置该posiiton boolean truebro我真的很欣赏您在运行时添加侦听器的想法。但这并没有奏效我也是。这是我的代码,请看一看。你需要使用一个适配器和一个holder类,如上面的代码所示。并且,应将onlcik提供给持有者视图。您仍然在主活动本身中为listitem提供onclick,而不使用viewholder类。有关使用viewholder类了解列表项的更多信息,请参阅上述教程
public class MyAdapter extends BaseAdapter{
String [] result;
Context context;
int [] imageId;
private static LayoutInflater inflater=null;
public Myadapter(MainActivity mainActivity, String[] prgmNameList, int[] prgmImages) {
// TODO Auto-generated constructor stub
result=prgmNameList;
context=mainActivity;
imageId=prgmImages;
inflater = ( LayoutInflater )context.
getSystemService(Context.LAYOUT_INFLATER_SERVICE);
}
@Override
public int getCount() {
// TODO Auto-generated method stub
return result.length;
}
@Override
public Object getItem(int position) {
// TODO Auto-generated method stub
return position;
}
@Override
public long getItemId(int position) {
// TODO Auto-generated method stub
return position;
}
public class Holder
{
TextView tv_language;
ImageView im_language;
}
@Override
public View getView(final int position, View convertView, ViewGroup parent) {
// TODO Auto-generated method stub
Holder holder=new Holder();
View view;
view = inflater.inflate(R.layout.layout_language_list_item, null);
holder.tv_language=(TextView) view.findViewById(R.id.tv_language);
holder.im_language=(ImageView) view.findViewById(R.id.image);
holder.tv_language.setText(result[position]);
Picasso.with(context).load(imageId[position]).into(holder.image);
view.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
//your color change if loop should come here
}
});
return view;
}
}