大佬教程收集整理的这篇文章主要介绍了android – listview项目中的OnClickListener始终占据最后一行,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
LawsAdapter
public class LawsAdapter extends ArrayAdapter<Law> implements View.onClickListener { private LayoutInflater inflater; private Context context; private UserLocalStore userLocalStore; private IsVotedStorage isVotedStorage; private View convertView; private ViewHolder viewHolder; /** * Constructor,declares storages,context and inflater * @param context * @param textViewresourcEID */ public LawsAdapter(Context context,int textViewresourcEID) { super(context,textViewresourcEID); this.context = context; inflater = ((Activity) context).getLayoutInflater(); userLocalStore = new UserLocalStore(context); isVotedStorage = new IsVotedStorage(context); } /** * Second constructor,here you can set the resource (againstr the prevIoUs onE) * @param context * @param resource * @param items */ public LawsAdapter(Context context,int resource,List<Law> items) { super(context,resource,items); this.context = context; inflater = (LayoutInflater) context.getSystemservice(Context.LAYOUT_INFLATER_serviCE); userLocalStore = new UserLocalStore(context); isVotedStorage = new IsVotedStorage(context); } /** * Overriden method getView,declares graphic objects (btns... ) and set listeners * @param position * @param convertView * @param parent * @return view */ @Override public View getView(@R_489_2196@,View convertView,ViewGroup parent) { if (convertView == null) { convertView = inflater.inflate(R.layout.law_item,parent,falsE); this.convertView = convertView; viewHolder = new ViewHolder(); viewHolder.tvName = (TextView) convertView.findViewById(R.id.lawItemname); viewHolder.tvDescription = (TextView) convertView.findViewById(R.id.lawItemDescription); viewHolder.tvStatus = (TextView) convertView.findViewById(R.id.lawItemStatus); viewHolder.btnDownVote = (Button) convertView.findViewById(R.id.lawItemDownVote); viewHolder.btnUpVote = (Button) convertView.findViewById(R.id.lawItemUpVote); viewHolder.btnMakeComment = (Button) convertView.findViewById(R.id.lawItemMakeComment); viewHolder.currentLaw = getItem(position); Log.d("View holder","new one"); Log.d("LAW ID,ADAPTER",String.valueOf(viewHolder.currentLaw.getId())); viewHolder.tvName.setText(viewHolder.currentLaw.getName()); viewHolder.tvDescription.setText(viewHolder.currentLaw.getDescription()); viewHolder.tvStatus.setText(viewHolder.currentLaw.getStateValue()); setSurfacesColors(); viewHolder.btnMakeComment.setOnClickListener(this); viewHolder.btnDownVote.setOnClickListener(this); viewHolder.btnUpVote.setOnClickListener(this); disableIfVoted(); convertView.setTag(viewHolder); } else { viewHolder = (ViewHolder) convertView.getTag(); Log.d("View holder","get tag"); } return convertView; } /** * Set the colors of surfaces */ private void setSurfacesColors() { viewHolder.sfLeft = (SurfaceView) convertView.findViewById(R.id.lawItemSurfaceLeft); viewHolder.sfBACkground = (SurfaceView) convertView.findViewById(R.id.lawItemSurfaceBACkground); Log.d("VoteS","Positive: " + viewHolder.currentLaw.getPositiveVotes() + " Negative: " + viewHolder.currentLaw.getNegativeVotes()); if ((viewHolder.currentLaw.getNegativePercent() + viewHolder.currentLaw.getNegativeVotes()) > 1) { viewHolder.sfBACkground.setBACkgroundColor(context.getresources().getColor(R.color.redSurfaceBckg)); viewHolder.sfLeft.setBACkgroundColor(context.getresources().getColor(R.color.btnSubmitColor)); int screenWidth = getScreenWidth(); int upVote = viewHolder.currentLaw.getNegativePercent(); int downVote = viewHolder.currentLaw.getPositivePercent(); int positivePixels = (screenWidth / 100) * upVote; int negativePixels = (screenWidth / 100) * downVote; viewHolder.sfBACkground.getHolder().setFixedSize(negativePixels,5); viewHolder.sfLeft.getHolder().setFixedSize(positivePixels,5); Log.d("updatE","NOTIFY"); } else { viewHolder.sfBACkground.setBACkgroundColor(context.getresources().getColor(R.color.greySurfacE)); viewHolder.sfLeft.setBACkgroundColor(context.getresources().getColor(R.color.greySurfacE)); } } /** * UpVote * @param law */ private void upVote(Law law) { Serverrequest serverrequest = new Serverrequest(context); serverrequest.upVoteLawInBACkground(law.getId(),new UpDownCallBACk() { @Override public void done(Law law) { viewHolder.currentLaw = law; setSurfacesColors(); Log.e("VoteS in UPVote","Positive: " + viewHolder.currentLaw.getPositiveVotes() + " Negative: " + viewHolder.currentLaw.getNegativeVotes()); } }); } /** * DownVote * @param law */ private void downVote(Law law) { Serverrequest serverrequest = new Serverrequest(context); serverrequest.downVoteLawInBACkground(law.getId(),new UpDownCallBACk() { @Override public void done(Law law) { viewHolder.currentLaw = law; setSurfacesColors(); } }); } /** * Get screen width in pixels * @return int screen width */ privatE int getScreenWidth() { WindowManager wm = (WindowManager) context.getSystemservice(Context.WINDOW_serviCE); Display display = wm.getDefaultDisplay(); Point size = new Point(); display.getSize(sizE); int width = size.x; return width; } /** * Disable voTing button if I have already Voted */ private void disableIfVoted() { if (isVotedStorage.isVoted(viewHolder.currentLaw.getId())) { viewHolder.btnUpVote.setEnabled(false); viewHolder.btnDownVote.setEnabled(false); } } @Override public void onClick(View v) { switch (v.getId()) { case R.id.lawItemMakeComment: if (userLocalStore.isUserLoggedIn()) { Log.d("ON CLICK LAW ID",String.valueOf(viewHolder.currentLaw.getId())); Intent commentsIntent = new Intent(context,DialogCommentsActivity.class); commentsIntent.putExtra("law_id",viewHolder.currentLaw.getId()); commentsIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOp); Log.d("CURRENT LAW",viewHolder.currentLaw.getId() + " " + viewHolder.currentLaw.getName()); context.startActivity(commentsIntent); } else { context.startActivity(new Intent(context,DialogSignInActivity.class)); } break; case R.id.lawItemDownVote: if (userLocalStore.isUserLoggedIn()) { isVotedStorage.setVoted(true,viewHolder.currentLaw.getId()); downVote(viewHolder.currentLaw); disableIfVoted(); notifyDataSetChanged(); } else { context.startActivity(new Intent(context,DialogSignInActivity.class)); } break; case R.id.lawItemUpVote: if (userLocalStore.isUserLoggedIn()) { isVotedStorage.setVoted(true,viewHolder.currentLaw.getId()); upVote(viewHolder.currentLaw); disableIfVoted(); notifyDataSetChanged(); } else { context.startActivity(new Intent(context,DialogSignInActivity.class)); } break; } } /** * Holds items per row */ private static class ViewHolder { private TextView tvName; private TextView tvDescription; private TextView tvStatus; private Button btnUpVote; private Button btnDownVote; private Button btnMakeComment; private SurfaceView sfBACkground; private SurfaceView sfLeft; private Law currentLaw; }
}
law_item.xml
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://scheR_962_11845@as.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="170dp" android:gravity="bottom" android:padding="6pt" android:BACkground="@color/button_material_light"> <RelativeLayout xmlns:android="http://scheR_962_11845@as.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="140dp" android:gravity="bottom" android:BACkground="@color/BACkground_floaTing_material_light" android:theme="@style/AppTheme" android:id="@+id/rel"> <SurfaceView android:layout_width="match_parent" android:layout_height="wrap_content" android:id="@+id/lawItemSurfaceBACkground" android:layout_alignParentTop="true" android:layout_alignParentLeft="true" android:layout_alignParentStart="true" /> <SurfaceView android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/lawItemSurfaceLeft" android:layout_alignBaseline="@+id/lawItemSurfaceBACkground" android:layout_alignBottom="@+id/lawItemSurfaceBACkground" android:layout_alignParentLeft="true" android:layout_alignParentStart="true" /> <TextView android:layout_width="match_parent" android:layout_height="wrap_content" android:id="@+id/lawItemname" android:textAppearance="?android:attr/textAppearanceLarge" android:layouT_Below="@+id/lawItemSurfaceBACkground" android:layout_marginTop="2pt" android:layout_marginBottom="3pt" android:layout_marginLeft="3pt" android:layout_marginRight="3pt" android:padding="1pt"/> <TextView android:layout_width="match_parent" android:layout_height="wrap_content" android:layouT_Below="@+id/lawItemname" android:textAppearance="?android:attr/textAppearanceMedium" android:padding="1pt" android:layout_marginLeft="3pt" android:layout_marginRight="3pt" android:layout_marginBottom="3pt" android:id="@+id/lawItemDescription" /> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:padding="1pt" android:layout_marginBottom="3pt" android:id="@+id/lawItemStatus" android:layout_marginRight="30pt" android:layouT_Below="@+id/lawItemDescription" android:layout_alignParentright="true" android:layout_alignParentEnd="true" /> <LinearLayout android:layout_width="match_parent" android:layout_height="38dp" android:layouT_Below="@id/lawItemStatus" android:orientation="horizontal"> <Button android:layout_weight="1" android:layout_height="wrap_content" android:BACkground="@color/btnSubmitColor" android:textColor="@color/btnSubmitTextColor" android:layout_width="match_parent" android:focusable="false" android:text="@String/button_upVote" android:id="@+id/lawItemUpVote" /> <Button android:layout_weight="1" android:layout_height="wrap_content" android:layout_width="match_parent" android:BACkground="@color/btnSubmitColor" android:textColor="@color/btnSubmitTextColor" android:text="@String/button_downVote" android:focusable="false" android:id="@+id/lawItemDownVote" /> <Button android:layout_weight="1" android:layout_height="wrap_content" android:layout_width="match_parent" android:BACkground="@color/btnSubmitColor" android:textColor="@color/btnSubmitTextColor" android:focusable="false" android:text="@String/button_comment" android:id="@+id/lawItemMakeComment" /> </LinearLayout> </RelativeLayout> </LinearLayout>
示例:我在第一行单击btnMakeComment,新的Activity打开并从id为15的对象的db注释下载.然后我单击第三行中的btnMakeComment并打开新的Activity并从对象的db注释下载具有相同的ID,就像上次(再次15).
但是在ListView中不是相同的行/对象,它们在点击时是不同的,看起来它们会是相同的.
DialogCommentsActivity
/** * Activity for adding and reading comments */ public class DialogCommentsActivity extends AppCompatActivity implements AbsListView.onItemClickListener,AbsListView.onScrollListener,View.onClickListener { privatE int lawId; privatE int limit; privatE int offset; privatE int preLast; privatE int page; private ListView listView; private EditText etAddComment; private List<Comment> activityCommentList; private UserLocalStore userLocalStore; private User user; private Button btnSubmit; private CommentsAdapter commentsAdapter; @Override protected void onCreate(Bundle savedInstanceStatE) { super.onCreate(savedInstanceStatE); setContentView(R.layout.activity_comments_dialog); settitle(""); setFinishOnTouchOutside(true); listView = (ListView) findViewById(R.id.commentDialogListView); limit = 5; offset = 0; page = 1; userLocalStore = new UserLocalStore(this); user = userLocalStore.getLoggedUser(); etAddComment = (EditText) findViewById(R.id.commentDialogEditAdd); btnSubmit = (Button) findViewById(R.id.commentsDialogSubmit); btnSubmit.setEnabled(false); listView.setOnItemClickListener(this); listView.setOnScrollListener(this); btnSubmit.setOnClickListener(this); Bundle extras = geTintent().getExtras(); String userName; dumpIntent(geTintent()); if (extras != null) { lawId = extras.geTint("law_id"); } Log.e("LAW ID HOHOHO",String.valueOf(lawId)); fillAdapter(limit,offset); etAddComment.addTextChangedListener(new TextWatcher() { @Override public void ontextChanged(CharSequence s,int start,int before,int count) { if (s.toString().trim().length() == 0) { btnSubmit.setEnabled(false); } else { btnSubmit.setEnabled(true); } } @Override public void beforeTextChanged(CharSequence s,int count,int after) { // TODO Auto-generated method stub } @Override public void afterTextChanged(Editable s) { // TODO Auto-generated method stub } }); } @Override public Boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.menu_detail_law,menu); return true; } @Override public Boolean onOptionsItemSELEcted(MenuItem item) { // Handle action bar item clicks here. The action bar will // automatically handle clicks on the Home/Up button,so long // as you specify a parent activity in AndroidManifest.xml. int id = item.getItemId(); //noinspection SimplifiableIfStatement if (id == R.id.action_setTings) { return true; } return super.onOptionsItemSELEcted(item); } @Override public void onScrollStateChanged(AbsListView view,int scrollStatE) { } @Override public void onScroll(AbsListView absListView,int firstVisibleItem,int visibleItemCount,int @R_892_10586@lItemCount) { switch(listView.getId()) { case R.id.commentDialogListView: Log.d("SCROLL","scroll"); Boolean loadMore = firstVisibleItem + visibleItemCount >= @R_892_10586@lItemCount-1; if (loadMorE) { page += 1; // offset = (page * limit) - limit + 1; // fillAdapter(limit,offset); // commentsAdapter.notifyDataSetChanged(); TODO } } } @Override public void onItemClick(AdapterView<?> parent,View view,@R_489_2196@,long id) { } public void fillAdapter(int limit,int offset) { Serverrequest serverrequest = new Serverrequest(this); Log.e("LAWID BEFORE requEST",String.valueOf(lawId)); serverrequest.fetchCommentsInBACkground(lawId,limit,offset,new GetCommentsCallBACk() { @Override public void done(List<Comment> comments) { commentsAdapter = new CommentsAdapter(getApplicationContext(),R.layout.comment_item,comments); listView.setAdapter(commentsAdapter); activityCommentList = commentsAdapter.getList(); } }); } public void loadData(int limit,new GetCommentsCallBACk() { @Override public void done(List<Comment> comments) { // updating parsed JSON data into ListView for (Comment comment : comments) { Log.d("COMMENT OBjeCT",comment.getText()); activityCommentList.add(comment); } } }); } /** * Handle click events,comments adding * @param v */ @Override public void onClick(View v) { switch (v.getId()) { case R.id.commentsDialogSubmit: String text = String.valueOf(etAddComment.getText()); Date dt = new Date(); Log.d("Click","Click"); if (userLocalStore.isUserLoggedIn()) { Log.e("LAW ID NEW COMM",String.valueOf(lawId)); Comment comment = new Comment(text,dt,user,lawId); addComment(comment); etAddComment.setText(""); //notifyData(limit,offset); limit = 15; offset = 0; fillAdapter(limit,offset); commentsAdapter.notifyDataSetChanged(); Log.e("numbER OF COMMENTS",String.valueOf(activityCommentList.size())); } break; } } /** * Insert comment * @param comment */ public void addComment(Comment comment) { Serverrequest serverrequest = new Serverrequest(this); serverrequest.storeCommenTinBACkground(comment,new GetCommentsCallBACk() { @Override public void done(List<Comment> list) { Log.d("Comment","Comment was added."); } }); } private void dumpIntent(Intent i) { Bundle bundle = i.getExtras(); if (bundle != null) { Set<String> keys = bundle.keySet(); Iterator<String> it = keys.iterator(); Log.e("EXTRAS","Dumping Intent start"); while (it.hasNext()) { String key = it.next(); Log.e("EXTRAS","[" + key + "=" + bundle.get(key) + "]"); } Log.e("EXTRAS","Dumping Intent end"); } } }
解:
我添加了ViewHolder viewHolder = v.getTag();在每个监听器中(以及在每个按钮上的getView中的setTag(viewHolder)之前)
@Override public View getView(@R_489_2196@,ViewGroup parent) { if (convertView == null) { convertView = inflater.inflate(R.layout.law_item,falsE); this.convertView = convertView; viewHolder = new ViewHolder(); viewHolder.position = position; viewHolder.tvName = (TextView) convertView.findViewById(R.id.lawItemname); viewHolder.tvDescription = (TextView) convertView.findViewById(R.id.lawItemDescription); viewHolder.tvStatus = (TextView) convertView.findViewById(R.id.lawItemStatus); viewHolder.btnDownVote = (Button) convertView.findViewById(R.id.lawItemDownVote); viewHolder.btnUpVote = (Button) convertView.findViewById(R.id.lawItemUpVote); viewHolder.btnMakeComment = (Button) convertView.findViewById(R.id.lawItemMakeComment); viewHolder.btnMakeComment.setTag(viewHolder); viewHolder.btnDownVote.setTag(viewHolder); viewHolder.btnUpVote.setTag(viewHolder); convertView.setTag(viewHolder); } else { viewHolder = (ViewHolder) convertView.getTag(); Log.d("View holder","get tag"); } viewHolder.currentLaw = getItem(position); Log.d("View holder",String.valueOf(viewHolder.currentLaw.getId())); viewHolder.tvName.setText(viewHolder.currentLaw.getName()); viewHolder.tvDescription.setText(viewHolder.currentLaw.getDescription()); viewHolder.tvStatus.setText(viewHolder.currentLaw.getStateValue()); setSurfacesColors(); disableIfVoted(); viewHolder.btnMakeComment.setOnClickListener(onCommentClickListener); viewHolder.btnDownVote.setOnClickListener(onDowvnVoteClickListener); viewHolder.btnUpVote.setOnClickListener(onUpVoteClickListener); // viewHolder.btnMakeComment.setOnClickListener(onCommentClickListener); return convertView; } @Override public long getItemId(@R_489_2196@) { return laws.get(position).getId(); } @Override public Law getItem(@R_489_2196@) { return laws.get(position); } /** * On upVote listener */ private View.onClickListener onUpVoteClickListener = new View.onClickListener() { @Override public void onClick(View v) { ViewHolder viewHolder = (ViewHolder) v.getTag(); if (userLocalStore.isUserLoggedIn()) { isVotedStorage.setVoted(true,DialogSignInActivity.class)); } } }; /** * On downVote listener */ private View.onClickListener onDowvnVoteClickListener = new View.onClickListener() { @Override public void onClick(View v) { ViewHolder viewHolder = (ViewHolder) v.getTag(); if (userLocalStore.isUserLoggedIn()) { isVotedStorage.setVoted(true,DialogSignInActivity.class)); } } }; /** * On comment listener,open comment dialog */ private View.onClickListener onCommentClickListener = new View.onClickListener() { @Override public void onClick(View v) { ViewHolder viewHolder = (ViewHolder) v.getTag(); if (userLocalStore.isUserLoggedIn()) { Log.d("ON CLICK LAW ID",DialogSignInActivity.class)); } } };
以上是大佬教程为你收集整理的android – listview项目中的OnClickListener始终占据最后一行全部内容,希望文章能够帮你解决android – listview项目中的OnClickListener始终占据最后一行所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。