我正在做一个项目,其中有一个自定义 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/