Android ListView 如何在未选中时更新视图

Android ListView how to update the view on unselected

我有一个 ListView,我想在其中将所选行更改为不同的颜色,但在未选中时将其重置为原始颜色。我使用 onItemSelectedListener 设置颜色,效果很好,但是取消选中后如何重置颜色?

谢谢。

创建侦听器接口:

public interface ListListener {
     void clickListItem(int position);
}

这是模型 class:

public class Route {
    String studentName;
    boolean colorRed;

    public Route(String studentName, boolean colorRed) {
        this.studentName=studentName;
        this.colorRed=colorRed;
    }

    public String getStudentName() {
        return studentName;
    }

    public void setStudentName(String studentName) {
        this.studentName = studentName;
    }

    public boolean isColorRed() {
        return colorRed;
    }

    public void setColorRed(boolean colorRed) {
        this.colorRed = colorRed;
    }
}

创建适配器class:

public class AAdapter  extends BaseAdapter implements View.OnClickListener {

    Context context;
    private List<Route> routes;
    Holder holder;
    private static LayoutInflater inflater=null;
    ListListener listListener;

    public AAdapter(Context context, List<Route> names,ListListener listListener) {
       this.routes=names;
        this.context=context;
        this.listListener=listListener;
        inflater = ( LayoutInflater )context.
                getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    }

    @Override
    public void onClick(View view) {
        listListener.clickListItem((Integer)view.getTag());
    }

    private class Holder
    {
        TextView tv;
    }

    @Override
    public Route getItem(int position) {
        return routes.get(position);
    }

    @Override
    public long getItemId(int position) {
        return position;
    }

    @Override
    public int getCount() {
        return routes.size();
    }

    @NonNull
    @Override
    public View getView(int position, View convertView, ViewGroup parent) {

        if (convertView==null){
            holder=new Holder();

            convertView=inflater.inflate(R.layout.custom_layout,null);

            holder.tv=(TextView)convertView.findViewById(R.id.textView);
            holder.tv.setOnClickListener(this);
            convertView.setTag(holder);

        }else {
            holder=(Holder)convertView.getTag();
        }

        holder.tv.setText(routes.get(position).getStudentName());
        holder.tv.setTag(position);

        if (!routes.get(position).colorRed){
            holder.tv.setBackgroundColor(Color.GREEN);
        }else {
            holder.tv.setBackgroundColor(Color.RED);
        }
        return convertView;
    }
}

现在 MainActivity Class:

public class MainActivity extends AppCompatActivity implements ListListener{

    AAdapter adapter;
    ListView lv;
    List<Route> myNames;
    ListListener listListener=MainActivity.this;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        lv=(ListView)findViewById(R.id.listnames);


        myNames=new ArrayList<>();

        /* DEMO DATA U NEED TO FETCH YOUR DATA */
        myNames.add(new Route("FIRST",false));
        myNames.add(new Route("Second",false));
        myNames.add(new Route("Third",false));
        myNames.add(new Route("Fourth",false));
        myNames.add(new Route("Fifth",false));

        myNames.add(new Route("FIRST",false));
        myNames.add(new Route("Second",false));
        myNames.add(new Route("Third",false));
        myNames.add(new Route("Fourth",false));
        myNames.add(new Route("Fifth",false));

        myNames.add(new Route("FIRST",false));
        myNames.add(new Route("Second",false));
        myNames.add(new Route("Third",false));
        myNames.add(new Route("Fourth",false));
        myNames.add(new Route("Fifth",false));

        myNames.add(new Route("FIRST",false));
        myNames.add(new Route("Second",false));
        myNames.add(new Route("Third",false));
        myNames.add(new Route("Fourth",false));
        myNames.add(new Route("Fifth",false));


        adapter = new AAdapter(this, myNames,listListener);
        lv.setAdapter(adapter);
        adapter.notifyDataSetChanged();
    }

    @Override
    public void clickListItem(int position) {
        if(myNames.get(position).colorRed){
           myNames.get(position).colorRed=false;
        }else {
            myNames.get(position).colorRed=true;
        }
        adapter.notifyDataSetChanged();
    }
}

public class路线{

    boolean colorRed;

    public Route(String studentName, boolean colorRed) {
        this.colorRed=colorRed;
    }

    public boolean isColorRed() {
        return colorRed;
    }

    public void setColorRed(boolean colorRed) {
        this.colorRed = colorRed;
    }
}

listview.setOnItemClickListener(new AdapterView.OnItemClickListener() {
    @Override
    public void onItemClick(AdapterView<?> parent, View view, final int position, long id) {
        if(listitem.get(position).isColorRed){

            listitem.get(position).setColorRed=false;
        }else{
            listitem.get(position).setColorRed=true;
        }
        youradapter.notifyDataSetChanged();

    }
}

@NonNull @覆盖 public View getView(int position, View convertView, ViewGroup parent) {

    if (convertView==null){
        holder=new Holder();

        convertView=inflater.inflate(R.layout.custom_layout,null);

        holder.tv=(TextView)convertView.findViewById(R.id.textView);
        holder.tv.setOnClickListener(this);
        convertView.setTag(holder);

    }else {
        holder=(Holder)convertView.getTag();
    }

    holder.tv.setText(routes.get(position).getStudentName());
    holder.tv.setTag(position);

    if (!routes.get(position).colorRed){
        holder.tv.setBackgroundColor(Color.GREEN);
    }else {
        holder.tv.setBackgroundColor(Color.RED);
    }
    return convertView;
}

为 activity_main.xml 中的 ListView 添加属性 "android:listSelector"。 例如android:listSelector="@drawable/selected".

<ListView
        android:id="@+id/lv_my_list_view"
        android:layout_width="match_parent"
        android:listSelector="@drawable/selected"
        android:layout_height="match_parent">

其中 selected.xml 是资源布局包含

    <?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_selected="true" android:drawable="@android:color/holo_red_dark"/>
</selector>