java - CustomListview 在 ListView 中显示两次状态

标签 java android listview android-listview

我正在做一个项目,其中有一个自定义 ListView ,它显示不同的字段并显示任务状态。数据作为类的对象接收

我用来调用基本适配器的类如下:

package com.igloo.fragments;

import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ListView;
import android.widget.Toast;

import com.igloo.adapters.CustomTaskListAdapter;
import com.igloo.classes.Applied_job_data;
import com.igloo.marinaretail.R;
import com.igloo.marinaretail.UserMain;

public class TaskDescriptionFragment extends Fragment {
    ListView list_tasks_final;
    Applied_job_data job_object,job_object_new;
    CustomTaskListAdapter ctadp;

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
        View view=inflater.inflate(R.layout.taskdescriptionfragment, container, false);
        list_tasks_final=(ListView) view.findViewById(R.id.list_tasks_final);
        job_object=(Applied_job_data) getArguments().getSerializable("job_object");
        ctadp=new CustomTaskListAdapter(getActivity(), job_object);
        list_tasks_final.setAdapter(ctadp);


        return view;

}
    @Override
    public void onViewCreated(View view, Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        super.onViewCreated(view, savedInstanceState);
         job_object_new=((UserMain) getActivity()).new_job_object;

        if(job_object_new!=null)
        {
        ctadp=new CustomTaskListAdapter(getActivity(), job_object_new);
        }
        else
        {
            ctadp=new CustomTaskListAdapter(getActivity(), job_object);
        }
        list_tasks_final.setAdapter(ctadp);
        ctadp.notifyDataSetChanged();

    }
    @Override
    public void onDestroyView() {

        super.onDestroyView();
    }
}

适配器如下:

package com.igloo.adapters;

import com.igloo.adapters.CustomMyJobsAdapter.MyJobHolder;
import com.igloo.classes.Applied_job_data;
import com.igloo.classes.Task_data;
import com.igloo.marinaretail.R;
import com.igloo.marinaretail.UserMain;

import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.RelativeLayout;
import android.widget.TextView;
import android.widget.Toast;

public class CustomTaskListAdapter extends BaseAdapter {

    Context context;
    Applied_job_data job_object;
    LayoutInflater tasks_inflate;

    public CustomTaskListAdapter(Context context,Applied_job_data job_object)
    {
        this.context=context;
        this.job_object=job_object;
        tasks_inflate=LayoutInflater.from(context);
    }

    @Override
    public int getCount() {
        // TODO Auto-generated method stub
        return job_object.tasklist.size();
    }

    @Override
    public Object getItem(int position) {
        // TODO Auto-generated method stub
        return job_object.tasklist.get(position);
    }

    @Override
    public long getItemId(int position) {
        // TODO Auto-generated method stub
        return position;
    }

    @Override
    public View getView(final int position, View convertView, ViewGroup parent) {
        MyTasksHolder holder;
        if(convertView==null)
        {
            convertView=tasks_inflate.inflate(R.layout.list_tasks_single,null);
            holder =new MyTasksHolder();
            holder.txttaskname=(TextView) convertView.findViewById(R.id.txttaskname);
            holder.txttasktype=(TextView) convertView.findViewById(R.id.txttasktype);
            holder.txttaskprice=(TextView) convertView.findViewById(R.id.txttaskprice);
            holder.txttaskstatus=(TextView) convertView.findViewById(R.id.txttaskstatus);
            holder.root_tasks_layout=(RelativeLayout) convertView.findViewById(R.id.root_tasks_layout);
            convertView.setTag(holder);
        }
        else
        {
            holder = (MyTasksHolder) convertView.getTag();
        }
        holder.txttaskname.setText(job_object.tasklist.get(position).task_name);
        holder.txttaskprice.setText("Rs "+job_object.tasklist.get(position).task_price);
        holder.txttasktype.setText(job_object.tasklist.get(position).task_type);
        if(job_object.tasklist.get(position).task_status.equals("COMPLETED"))
        {
            holder.txttaskstatus.setText("DONE");
        }
        holder.root_tasks_layout.setTag(job_object);

        holder.root_tasks_layout.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                Applied_job_data data=(Applied_job_data)((RelativeLayout)v).getTag();
                //Toast.makeText(context,"Clicked "+data.tasklist.get(position).task_name,Toast.LENGTH_LONG).show();
                if(data.tasklist.get(position).task_type.equals("IMAGE"))
                {
                    String task_id=data.tasklist.get(position).task_id;
                    String task_status=data.tasklist.get(position).task_status;
                    ((UserMain)context).showcamerafragment(data,task_id,task_status);
                }
                if(data.tasklist.get(position).task_type.equals("TEXT"))
                {

                }
                if(data.tasklist.get(position).task_type.equals("IMAGE_TEXT"))
                {

                }
            }
        });
        ((UserMain) context).new_job_object=null;
        return convertView;
    }
    static class MyTasksHolder
    {
        RelativeLayout root_tasks_layout;
        TextView txttaskname;
        TextView txttasktype;
        TextView txttaskprice;
        TextView txttaskstatus;
    }

}

问题出在我为 ListView 中的 TextView 设置状态“完成”的那一行。

if(job_object.tasklist.get(position).task_status.equals("COMPLETED"))
        {
            holder.txttaskstatus.setText("DONE");
        }

问题是我收到了两个字段的完成消息。当它必须只用于一个字段时。

我还使用 onviewcreated 方法在我返回 fragment 时获取对象。

当我调试代码时,customlistview 运行了 3 次以上,即对象的大小。但是我在两个列表项中收到完成消息。我只想要一次。请帮忙

最佳答案

这可能会也可能不会最终解决您的问题,但您仍然应该实现它。 Listviews 做 View 回收。这意味着以后可以将每一行分配到不同的位置。这在可滚动的 ListView 中尤其可能发生。当它们被重新分配时,它们会携带所有放置在它们 View 中的数据(例如,您使用 textView.setText() 放置的文本)。

通过这样做,程序员不必重新初始化在初始设置后不会更改的值。但它确实意味着你标记为“完成”的事情,例如,可能会被重新分配到另一行,并将它的“完成”带到那里。解决此问题的方法是,如果您在一次性设置方法后更改了所有文本(例如,在您膨胀它的地方),则始终在 getView() 方法中将文本设置为正确的值。

因此...

if(job_object.tasklist.get(position).task_status.equals("COMPLETED"))
    {
        holder.txttaskstatus.setText("DONE");
    }else{
        //I've added this else clause to your code.
        holder.txttaskstatus.setText("MyTextIfNotDone");
    }

关于java - CustomListview 在 ListView 中显示两次状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26945004/

相关文章:

java - 尝试更新 MainActivity 之外的 UI 元素

java - 客户端结束连接还是服务器?

android - setText 从字符串到 EditText

使用 Google API 的 Android InApp 购买验证失败

java - 如果 DataProvider 使用单个测试方法的不同数据运行多个测试,则在 TestNG/Maven 报告中获取测试方法名称

java - 如何在java中读取Servlet中的URL并打印

JavaScript Canvas 游戏开发

c# - 水平 ListView Xamarin.Forms

php - 为什么我的 mysql 表的后续结果没有在 ListView 中创建新对象?

c# - 用于 Windows 窗体应用程序 ListView 项(小图标 View )的最佳图标大小是多少