custom list view
을 사용하고 있습니다. 각 행에는 두 개의 이미지보기와 텍스트보기가 있습니다. 나는 getView()
방법에서 view holder
을 custom adapter
의 방법으로 사용하고 있습니다. getview()
방법의 이미지 뷰 중 하나에 Onclicklistener()
을 설정 한 경우 onSelectItemListener()
listview
에만 있습니다. 이제 imageview
을 클릭하면 특정 행에 영향을 미치지 만 아래로 스크롤하면 해당 클릭에 의해 임의의 행이 표시됩니다. 켜기를 클릭하면 일어납니다. viewholder
을 사용하지 않을 때 이런 일이 발생하지 않습니다. 나는 이것이 왜 일어나는지를 알지 못한다. 도와주세요. 여기 ViewHolder를 사용하면 비정상적인 결과가 발생합니다.
getView()
방법의 내 코드입니다 :
public View getView(int position, View convertView, ViewGroup parent) {
final int myposition = position;
// TODO Auto-generated method stub
if (convertView == null) {
LayoutInflater inflater = LayoutInflater.from(context);
convertView = inflater.inflate(R.layout.fileviewrowfrnview_layout, null);
ViewHolder holder = new ViewHolder();
holder.icon = (ImageView) convertView.findViewById(R.id.icon2);
holder.text = (TextView) convertView.findViewById(R.id.file_name2);
holder.download = (ImageView) convertView.findViewById(R.id.play_buttonOropen2);
convertView.setTag(holder);
}
final ViewHolder holder = (ViewHolder) convertView.getTag();
holder.download.setOnClickListener(new View.OnClickListener() {
@
Override
public void onClick(View v) {
// TODO Auto-generated method stub
if (frnshare_list.get(myposition).getFileType().trim()
.equalsIgnoreCase("file")) {
// it is file
if (frnshare_list.get(myposition).getDownloadStatus().trim()
.equalsIgnoreCase("0")) {
// is is not a downloaded file do download it
holder.icon.setVisibility(View.GONE);
holder.download.setVisibility(View.GONE);
holder.text.setTextSize(14);
Log.e("file to be download", "" + frnshare_list.get(myposition).getFileName());
if (frnshare_list.get(myposition).getFileName().length() > 15)
holder.text.setText(frnshare_list.get(myposition).getFileName().subSequence(0, 15) + " will be downloaded soon.");
else
holder.text.setText(frnshare_list.get(myposition).getFileName() + " will be downloaded soon.");
UserService us = new UserService(context);
Frnshared fdto = frnshare_list.get(myposition);
fdto.setDownloadStatus("2"); // in queue
fdto.setMessageId("0");
us.updateDowloadStatusById(fdto);
us.updatemsgIdbyId(fdto);
if (CommonUtility.isNetworkAvailable(context)) {
AsyncTask < Void, Void, Void > httpconnection = new AsyncTask < Void, Void, Void >() {@
Override
protected Void doInBackground(Void...params) {
// TODO Auto-generated method stub
NetworkCommunication nc = new NetworkCommunication(
context);
try {
UserService us = new UserService(
context);
Frnshared fdto = frnshare_list
.get(myposition);
Log.i("file to be download", "" + fdto.getFileName());
fdto.setDownloadStatus("2"); // in queue
fdto.setMessageId("0");
us.updateDowloadStatusById(fdto);
us.updatemsgIdbyId(fdto);
String response = nc
.MyHttpPostDownload(frnshare_list
.get(myposition));
ParsersAndDataInsertion.DownloadRequestResponseParser(
response, context,
frnshare_list.get(myposition));
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
// http call for download
return null;
}
}.execute(null, null, null);
}
Apitable(adto);
}
} else if (frnshare_list.get(myposition)
.getDownloadStatus().equalsIgnoreCase("1")) {
Intent intent = new Intent();
intent.setAction(android.content.Intent.ACTION_VIEW);
File file = new File(frnshare_list.get(myposition)
.getFileLocation());
intent.setDataAndType(Uri.fromFile(file), "audio/*");
context.startActivity(intent);
} else if (frnshare_list.get(myposition)
.getDownloadStatus().equalsIgnoreCase("2")) {
Toast.makeText(context, "already request snet", 2000)
.show();
}
} else if (frnshare_list.get(myposition).getFileType()
.equalsIgnoreCase("folder")) {}
}
});
// view purpose
String file_name = frnshare_list.get(position).getFileName();
if (file_name.length() > 15)
holder.text.setText(file_name.substring(0, 15) + "");
else
holder.text.setText(file_name); // frn name
try {
if (frnshare_list.get(myposition).getFileType()
.equalsIgnoreCase("file")) { // it is file
holder.icon.setImageResource(R.drawable.mp3_icon);
if (frnshare_list.get(myposition).getDownloadStatus()
.equalsIgnoreCase("0")) {
Log.i("file is ", "" + frnshare_list.get(myposition).getFileName());
holder.download.setImageResource(R.drawable.download_png);
} else if (frnshare_list.get(myposition).getDownloadStatus()
.equalsIgnoreCase("1")) {
} else if (frnshare_list.get(myposition).getDownloadStatus()
.equalsIgnoreCase("2")) {
Log.i("file is in queue", "" + frnshare_list.get(myposition).getFileName());
holder.icon.setVisibility(View.GONE);
holder.download.setVisibility(View.GONE);
holder.text.setTextSize(14);
if (frnshare_list.get(myposition).getFileName().length() > 15)
holder.text.setText(frnshare_list.get(myposition).getFileName().substring(0, 1);
else
holder.text.setText(frnshare_list.get(myposition).getFileName());
}
} else if (frnshare_list.get(myposition).getFileType()
.equalsIgnoreCase("folder")) {
holder.icon.setImageResource(R.drawable.folder);
}
} catch (Exception e) {
// TODO: handle exception
Intent i = new Intent(context, TabViewActivity.class);
i.putExtra("show", "frntab");
context.startActivity(i);
BugSenseHandler.sendException(e);
e.printStackTrace();
}
return convertView;
}
홀더에 대한 논리에 오류가있을 수 있습니다. 그래도 문제를 해결하려면 코드를 게시해야합니다. –
http://stackoverflow.com/questions/16726535/find-clicked-row-in-listview-and-get-data/16726623#16726623 –
@GabeSechan 선생님. 내 코드 –