如何切换和保存ListView项目颜色? [英] How to toggle ListView item colors and Save it?

查看:60
本文介绍了如何切换和保存ListView项目颜色?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在开发出勤应用程序.该应用程序具有由学生列表组成的 ListActivity .我想将颜色更改为红色和绿色,以指示缺少和存在.问题是如果我的学生比屏幕长.当前视图中向下或向上的项目会失去颜色.我的方法正确吗?如何保存每个列表项的颜色.当然,除了使用 ListView 之外,还有其他最好的选择,我愿意提出建议.

I'm working on an Attendance app. The app has ListActivity consisting of a list of students. I want to change color to RED and GREEN indicating absent and present. The problem is if I have long list of students than screen. The items that are down or up the current view loses color. Is my approach correct? How can I save the color of each individual list item. Of course if there is another best approch other than using ListView, I'm open to suggestions.

这是包含列表的ListActivity

Here is the ListActivity containing the list

public class ListActivity extends Activity implements Serializable{
private String userName;
private TextView nameTextView;
private ListView nameList;
private CustomAdapter adapter;
private boolean colorRed;
private Class myClass;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_list);

    myClass = new Class();
    colorRed = false;
//         Open the students list from file if exists
    openFromFile();

    nameList = (ListView) findViewById(R.id.nameListView);
    nameTextView = (TextView) findViewById(R.id.nameTextView);
    Bundle extras = getIntent().getExtras();
    if (extras != null) {
        userName = extras.getString("NAME");
        nameTextView.setText("Hi! " + userName);
    }

    adapter = new CustomAdapter(this, myClass.getStudentNames());
    nameList.setAdapter(adapter);
    TextView tv = (TextView) findViewById(R.id.sNametv);
    nameList.setOnItemClickListener(new AdapterView.OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> adapterView, View view, int position, long id) {

            if (colorRed == true) {
                view.setBackgroundColor(ContextCompat.getColor(getBaseContext(), R.color.colorPresent));
                colorRed = false;
            } else {
                view.setBackgroundColor(ContextCompat.getColor(getBaseContext(), R.color.colorAbsent));
                colorRed = true;
            }

//              ALso  could use this
//              adapterView.getChildAt(position).setBackgroundColor(Color.RED);

        }
    });
}

我正在使用 boolean colorRed 检查颜色,因为我无法将视图颜色与 colors xml 中的颜色进行比较.

I'm using a boolean colorRed for checking color as I'm not able to compare view color with color from colors xml.

nameList.setOnItemClickListener(new AdapterView.OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> adapterView, View view, int position, long id) {
            if (colorRed == true) {
                view.setBackgroundColor(ContextCompat.getColor(getBaseContext(), R.color.colorPresent));
                colorRed = false;
            } else {
                     view.setBackgroundColor(ContextCompat.getColor(getBaseContext(),    R.color.colorAbsent));
                colorRed = true;
            }
        }
    });

ListView的CustomAdapter类

CustomAdapter Class for ListView

public class CustomAdapter extends ArrayAdapter<String> {

public CustomAdapter(Context context, ArrayList<String> names) {
    super(context, R.layout.custom_layout, names);

}

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

    LayoutInflater inflater = LayoutInflater.from(getContext());
    View customView = inflater.inflate(R.layout.custom_layout, parent, false);
    String singleName = getItem(position);
    TextView tv = (TextView) customView.findViewById(R.id.sNametv);
    tv.setText(singleName);

    return customView;
}
}

我已经仔细检查了这是一个独特的问题!放心...

I've double checked it's a unique question! Rest Assured...

先谢谢您

推荐答案

创建侦听器接口:

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

这是Model类:

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;
    }
}

创建适配器类:

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类:

Now 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();
    }
}

这篇关于如何切换和保存ListView项目颜色?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆