我在android中创建了一个列表视图,我想做的事情就像每次点击列表项时一样,它必须在红色和绿色之间切换颜色。我能够实现这一点,但问题是每次我向上或向下滚动列表视图时,它会一次又一次地重新加载列表项,并且切换的颜色正在丢失。
我尝试使用切换按钮而不是仅手动调整颜色,但即使这样也会失去其状态。当用户点击它时,它会变为开启状态,当用户向上或向下滚动时,它会失去状态并显示状态。
这是我的MainActivity.java文件
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();
}
});
}
}
这是我的适配器:
class MyAdapter extends ArrayAdapter
{
View row;
TextView tv;
String titles[];
public MyAdapter(Context context , String[] titles )
{
super(context,R.layout.reg_li,R.id.reg_no,titles);
this.titles=titles;
}
@NonNull
@Override
public View getView(int position , View controlView , ViewGroup parent)
{
LayoutInflater inflater=(LayoutInflater)getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
row=inflater.inflate(R.layout.reg_li,parent,false);
tv=(TextView)row.findViewById(R.id.reg_no);
tv.setText(titles[position]);
return row;
}
}
答案 0 :(得分:0)
要做到这一点,你需要声明一个默认设置为false的布尔变量。当您单击任何特定项目时,获取项目的位置,并将布尔变量的值设置为true,它将帮助您获得结果。
答案 1 :(得分:0)
仅在适配器类上使用Viewholder for listview android set colors
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;
}
}
上面的适配器用于列表视图,包含一个imageview和一个textview。你需要在onclick监听器中提供你的换色代码。我在评论中提到了这个地方。请参阅Android Custom Listview以正确实施listview