多数のアイテムを含む GridView があるため、ユーザーはそれらをすべて表示するには下にスクロールする必要があります。GridView の各項目は、いくつかのイベントが関連付けられた Textview と Webview で構成されます。
問題: OnItemLongClickListener は、Activity が最初に作成されたときに表示されていないアイテム (表示するには下にスクロールする必要があるアイテム) に対して起動されません。
関連コード:
アクティビティ -
public class MyCoursesActivity extends ActivityBase implements ILoginListener, IUpdateListener, OnDragListener {
private ArrayList<Course> myCoursesList = new ArrayList<Course>();
private int draggedIndex = -1;
CoursesListAdapter coursesAdapter = new CoursesListAdapter(MyCoursesActivity.this, myCoursesList);
MyCourseAdapter mca = new MyCourseAdapter();
private void Load() throws ParseException
{
myCoursesList = mca.Load();
coursesAdapter = new CoursesListAdapter(MyCoursesActivity.this, myCoursesList);
final GridView gv = (GridView) findViewById(R.id.mycourses_Grid);
gv.setAdapter(coursesAdapter);
gv.setOnItemLongClickListener(new OnItemLongClickListener() {
public boolean onItemLongClick(AdapterView gridView, View view,
int position, long row) {
view = gridView.getChildAt(position);
ClipData.Item item = new ClipData.Item("");
ClipData clipData = new ClipData("",
new String[] { ClipDescription.MIMETYPE_TEXT_PLAIN }, item);
view.startDrag(clipData, new View.DragShadowBuilder(view), null, 0);
View trashCan = findViewById(R.id.trash_can);
trashCan.setVisibility(View.VISIBLE);
trashCan.setOnDragListener(MyCoursesActivity.this);
draggedIndex = position;
return true;
}
});
}
public boolean onDrag(View view, DragEvent dragEvent) {
switch (dragEvent.getAction()) {
case DragEvent.ACTION_DRAG_STARTED:
if (view.getId() == R.id.trash_can) {
view.animate().scaleX(1.0f);
view.animate().scaleY(1.0f);
return true;
} else
if (dragEvent.getClipDescription().hasMimeType(
ClipDescription.MIMETYPE_TEXT_PLAIN)) {
return true;
} else {
return false;
}
case DragEvent.ACTION_DRAG_ENTERED:
if (view.getId() == R.id.trash_can) {
view.animate().scaleX(1.5f);
view.animate().scaleY(1.5f);
}
return true;
case DragEvent.ACTION_DRAG_EXITED:
if (view.getId() == R.id.trash_can) {
view.animate().scaleX(1.0f);
view.animate().scaleY(1.0f);
}
view.invalidate();
return true;
case DragEvent.ACTION_DRAG_LOCATION:
return true;
case DragEvent.ACTION_DROP:
if (view.getId() == R.id.trash_can) {
//do stuff
}
coursesAdapter.notifyDataSetChanged();
case DragEvent.ACTION_DRAG_ENDED:
// Hide the trash can
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
findViewById(R.id.trash_can).setVisibility(View.INVISIBLE);
}
}, 1000l);
if (view.getId() == R.id.trash_can) {
view.animate().scaleX(1.0f);
view.animate().scaleY(1.0f);
} else {
view.setVisibility(View.VISIBLE);
}
// remove drag listeners
view.setOnDragListener(null);
return true;
}
return false;
}
}
GridView アダプタ --
public class CoursesListAdapter extends BaseAdapter {
private Context context;
private ArrayList<Course> courses;
public CoursesListAdapter(Context context, ArrayList<Course> courses){
this.context = context;
this.courses = courses;
}
<@Override getCount etc.>
@Override
public View getView(int position, View convertView, ViewGroup parentView) {
final Course course = (Course) getItem(position);
LayoutInflater inflater = LayoutInflater.from(context);
convertView = inflater.inflate(R.layout.course_view, parentView, false);
if(context instanceof OnDragListener){
convertView.setTag(course);
convertView.setOnDragListener((OnDragListener) context);
}
TextView title = (TextView) convertView.findViewById(R.id.courseview_titleTv);
title.setText(course.getTitle());
WebView wv = (WebView) convertView.findViewById(R.id.courseview_imageWv);
wv.setOnTouchListener(new OnTouchListener(){
@Override
public boolean onTouch(View arg0, MotionEvent event) {
if(event.getAction() == MotionEvent.ACTION_UP){
Intent myIntent = new Intent(context, CourseDetailsActivity.class);
myIntent.putExtra("Course", course);
context.startActivity(myIntent);
return true;
}
return false;
}
});
convertView.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
Intent myIntent = new Intent(context, CourseDetailsActivity.class);
myIntent.putExtra("Course", course);
context.startActivity(myIntent);
}
});
return convertView;
}
}
何か案が?ありがとうございました。
編集: WebViews の代わりに ImageViews を配置しようとしましたが、イベントに問題はないようです。固定ドローアブルで試しました。トラブルシューティングを容易にするために、webview の実際のコンテンツを独自のプロジェクトの ImageView に表示しようとしています。ここまでのコードです。ImageView は画像を表示しません (例: Google Doodle)
WebView から ImageView へ --
final WebView mWeb = (WebView) findViewById(R.id.webView1);
//final WebView mWeb = new WebView(this);
final ImageView imgView = (ImageView) findViewById(R.id.imageView1);
mWeb.setInitialScale(100);
mWeb.setWebViewClient(new WebViewClient() {
public void onPageFinished(WebView v, String url){
Picture picture = mWeb.capturePicture();
Bitmap bitmap = Bitmap.createBitmap(picture.getWidth(), picture.getHeight(), Bitmap.Config.ARGB_8888);
final Canvas c =new Canvas(bitmap);
picture.draw(c);
imgView.setMinimumWidth(bitmap.getWidth());
imgView.setMinimumHeight(bitmap.getHeight());
imgView.setImageBitmap(bitmap);
imgView.setVisibility(View.VISIBLE);
}
});
mWeb.loadUrl("http://www.google.com");