我试图用许多不同的方式声明OnClickListeners,结果是一样的.
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 */@OverrIDepublic VIEw getVIEw(int position,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); }}@OverrIDepublic 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://schemas.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://schemas.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 totalitemCount) { switch(ListVIEw.getID()) { case R.ID.commentDialogListVIEw: Log.d("SCRolL","scroll"); boolean loadMore = firstVisibleItem + visibleItemCount >= totalitemCount-1; if (loadMore) { page += 1; // offset = (page * limit) - limit + 1; // fillAdapter(limit,offset);// commentsAdapter.notifyDataSetChanged(); Todo } } } @OverrIDe public voID onItemClick(AdapterVIEw<?> parent,VIEw vIEw,int position,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(int position,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(int position) { return laws.get(position).getID(); } @OverrIDe public Law getItem(int position) { 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)); } } };解决方法 您每次都会获得最后一个ID /最后一行位置,因为最后一个视图最后会显示
要在按钮上单击行位置,可以将postion设置为按钮的标签,并在onclickListner中检查该标签
例如,在你的getvIEw()方法中,将position作为标记放在vIEwHolder.btnMakeComment按钮中
vIEwHolder.btnMakeComment.setTag(位置);并在OnClickListner检查标签int position =(int)v.getTag();
总结以上是内存溢出为你收集整理的android – listview项目中的OnClickListener始终占据最后一行全部内容,希望文章能够帮你解决android – listview项目中的OnClickListener始终占据最后一行所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)