这是用于Android应用程序的My GridView工具。 对于程序第一次它运作良好。但是在进行一些向上和向下滚动之后 我的问题是在gridview中我滚动它一段时间将错误的textview放在意想不到的位置。
GridView适配器的源代码如下。
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
mGridView=(GridView)findViewById(R.id.gridview_id);
InitializeVariable();
mGridView.setAdapter(new GridAdapter(GridViewExampleActivity.this));
mGridAdapter=new GridAdapter(GridViewExampleActivity.this);
// mGridView.setEnabled(false);
mGridView.setOnLongClickListener(this);
mGridView.setOnItemClickListener(this);
}
public class GridAdapter extends BaseAdapter{
public Context mContext_GridAdapter=getApplicationContext();
GridAdapter(Context context){
this.mContext_GridAdapter=context;
}
@Override
public int getCount() {
return Fix_Grid_View;
}
@Override
public Object getItem(int position) {
return position;
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
RelativeLayout mRelative_Box_Grid;
TextView mTextView;
View v;
if(convertView==null){
mLayoutInflater=LayoutInflater.from(GridViewExampleActivity.this);
v=mLayoutInflater.inflate(R.layout.relative_box_view, null);
mTextView=(TextView)v.findViewById(R.id.txt_number);
mRelative_Box_Grid=(RelativeLayout)v.findViewById(R.id.relative_view);
mRelative_Box_Grid.setLayoutParams(new GridView.LayoutParams(GridView.AUTO_FIT,Device_Height));
mRelative_Box_Grid.setPadding(2, 2, 2, 2);
mTextView.setTextSize(Fix_Text_Size);
mTextView.setText(String.valueOf(position));
mTextView.setId(position);
}else{
v=convertView;
}
return v;
}
}
这是我的主xml文件
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="fill_parent"
android:layout_height="fill_parent">
<GridView android:numColumns="3"
android:stretchMode="columnWidth"
android:layout_width="fill_parent" android:layout_height="fill_parent"
android:id="@+id/gridview_id"
android:longClickable="true"
></GridView>
</LinearLayout>
我将相同的main.xml文件放在res / layout-land中用于Landscape模式。
我还在AndroidManifest文件中添加了这一行,以便更改方向
android:configChanges="orientation"
并且当我们点击该位置的任何项目时,我也会实现TextView在这里看不见的是代码。
@Override
public void onItemClick(AdapterView<?> AdapterView, View view, int position, long arg3) {
int Child_Count;
RelativeLayout mRelativeLayout;
TextView mTextView;
try{
Toast.makeText(GridViewExampleActivity.this, "Position "+ position, 600).show();
Child_Count=AdapterView.getChildCount();
mRelativeLayout=(RelativeLayout) AdapterView.getChildAt(position);
mTextView=(TextView) mRelativeLayout.getChildAt(0);
mTextView.setVisibility(View.INVISIBLE);
// mGridAdapter.notifyDataSetChanged();
// mGridView.setAdapter(mGridAdapter);
Log.v(TAG, "Child Count is"+ Child_Count);
}catch(Exception e){
Log.v("log", " Mes"+TAG +e.getMessage());
}
}
此功能运行良好但在使用Ctrl + F11键在我的仿真器中进行一些方向更改后失败了一段时间。 这是我的Inflater View xml文件。
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:background="@drawable/rectangle_white"
android:id="@+id/relative_view"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
<TextView android:text="@string/hello"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:id="@+id/txt_number"/>
</RelativeLayout>
在这里,我附上我的演示应用程序的参考图像以获取问题。
当我向上和向下滚动Textview的值时,请查看第一张图像。意外
当Android移动版的横向视图发生相同变化时,从11开始就不应该以这种方式发生。
答案 0 :(得分:1)
在Adapter
中,尝试移动这些行:
mTextView=(TextView)v.findViewById(R.id.txt_number);
mTextView.setText(String.valueOf(position));
高于你的退货声明:
return v;
此外,我不确定,但我认为您不需要第mTextView.setId(position);
行,因为onClick
回调中提供了视图的位置。
答案 1 :(得分:0)
乍一看,我注意到以下几点:
mGridView=(GridView)findViewById(R.id.gridview_id);
InitializeVariable();
mGridView.setAdapter(new GridAdapter(GridViewExampleActivity.this));
mGridAdapter=new GridAdapter(GridViewExampleActivity.this);
为什么要创建两个GridAdapter? 我认为你只需要这样一个:
mGridView=(GridView)findViewById(R.id.gridview_id);
InitializeVariable();
// Create the GridAdapter
mGridAdapter=new GridAdapter(GridViewExampleActivity.this);
// Set the Adapter tp the gridview
mGridView.setAdapter(mGirdAdapter);
此外,请查看适配器的getView方法的代码。 Android会尝试尽可能多地重复使用视图。当convertView == null时,您只能实例化您的视图,例如仅适用于已填充的第一个视图。
滚动后,Android会尝试重新使用这些视图。因此,convertView不会为null,并且不会执行在视图中设置文本的代码。改为:
@Override
public View getView(int position, View convertView, ViewGroup parent) {
RelativeLayout mRelative_Box_Grid;
TextView mTextView;
View v;
// Assign the re-usable view to v
v = convertView;
if(v==null){
// Create views if v == null
mLayoutInflater=LayoutInflater.from(GridViewExampleActivity.this);
v=mLayoutInflater.inflate(R.layout.relative_box_view, null);
// NOTE: This will only be executed for the Views that will be
// visible initially (so, for 0 through 11)
}
// Setup your view to show the proper values
// NOTE: This will always be executed
mTextView=(TextView)v.findViewById(R.id.txt_number);
mRelative_Box_Grid=(RelativeLayout)v.findViewById(R.id.relative_view);
mRelative_Box_Grid.setLayoutParams(new GridView.LayoutParams(GridView.AUTO_FIT,Device_Height));
mRelative_Box_Grid.setPadding(2, 2, 2, 2);
mTextView.setTextSize(Fix_Text_Size);
mTextView.setText(String.valueOf(position));
mTextView.setId(position);
return v;
}
祝你好运