我们有一个GridView,其中有一堆项目,以至于用户需要向下滚动才能看到它们。 GridView中的每个项目都由一个Textview和一个Webview组成,并附带一些事件。
问题:OnItemLongClickListener不会在首次创建Activity时看不到的项目(您需要向下滚动以查看)。Android GridView没有在LongItemTouchListener上触发项目不可见
相关代码:
活动 -
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;
}
}
任何想法?谢谢。
编辑: 试图把ImageViews而不是WebViews和似乎没有问题的事件了。我们尝试了一个固定的drawable。我们试图让webview的实际内容显示在自己的项目中的ImageView中,以简化故障排除。这是迄今为止的代码。该ImageView的不显示任何图像(例如,谷歌涂鸦)
的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");
OMG! 'GridView'内的'Webview' !!!!!休斯顿,我们有一个问题。 –
@ M-WaJeEh你能介绍一下吗?有什么问题? – Sphaso
它只是'WebView'是一个非常沉重的组件,不应该在'ListView'或'GridView'中使用。我认为你有一些书签类应用程序欠发达。所以相反,我能想到的是,您应该从'WebView'生成位图,并在'GridView'内显示这些位图而不是整个'WebView'。它很容易从WebView生成位图,例如请参阅这个http:// stackoverflow。com/questions/10009265/rendering-android-webview-to-bitmap-html5-javascript-callback-issue –