我正在从数据库中使用适配器和带有这些元素和4个按钮的内容布局在gridview中加载一些元素(textview / imageview)。我试图做的是当用户点击其中一个时,用相对布局隐藏这4个按钮。在我的xml中,我将相对布局的可见性默认设置为GONE。我以编程方式将可见性状态更改为VISIBLE。 它工作正常。当我单击一个按钮时,会显示一个对话框,该对话框的OK按钮将相对布局可见性更改为VISIBLE(如我的代码所示)。问题是每次我滚动网格视图时,可见性都会消失 请问我做错了什么?
xml(gridview模型)
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:padding="2dp">
<RelativeLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/layout_grid"
android:background="@drawable/title_back"
android:layout_alignParentTop="true"
android:layout_alignParentStart="true">
<TextView
android:layout_below="@+id/criteria_pic"
android:id="@+id/criteria_text"
android:textColor="#000"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="List of criteria"
android:textAlignment="center"
android:textSize="12dp"
android:textStyle="bold"/>
<ImageView
android:id="@+id/criteria_pic"
android:layout_width="80dp"
android:layout_height="80dp"
android:foregroundGravity="center"
android:src="@mipmap/ic_launcher"
android:layout_margin="4dp"
android:layout_alignParentTop="true"
android:layout_centerHorizontal="true" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="50dp"
android:id="@+id/rank_layout"
android:layout_margin="2dp"
android:gravity="center"
android:orientation="horizontal"
android:layout_below="@+id/criteria_text"
android:layout_centerHorizontal="true">
<ImageButton
android:layout_width="30dp"
android:layout_height="30dp"
android:id="@+id/btn1"
android:clickable="true"
android:background="#fff"
android:layout_marginRight="4dp"
android:foregroundGravity="center"
android:src="@drawable/rank_btn1"
android:scaleType="fitCenter"
android:layout_below="@+id/criteria_text"
android:layout_centerHorizontal="true" />
<ImageButton
android:layout_width="30dp"
android:layout_height="30dp"
android:id="@+id/btn2"
android:background="#fff"
android:layout_marginRight="4dp"
android:foregroundGravity="center"
android:src="@drawable/rank_btn2"
android:scaleType="fitCenter"
android:layout_below="@+id/criteria_text"
android:layout_centerHorizontal="true" />
<ImageButton
android:layout_width="30dp"
android:layout_height="30dp"
android:id="@+id/btn3"
android:background="#fff"
android:layout_marginRight="4dp"
android:foregroundGravity="center"
android:src="@drawable/rank_btn4"
android:scaleType="fitCenter"
android:layout_below="@+id/criteria_text"
android:layout_centerHorizontal="true" />
<ImageButton
android:layout_width="30dp"
android:layout_height="30dp"
android:id="@+id/btn4"
android:background="#fff"
android:layout_marginRight="4dp"
android:foregroundGravity="center"
android:src="@drawable/rank_btn5"
android:scaleType="fitCenter"
android:layout_below="@+id/criteria_text"
android:layout_centerHorizontal="true" />
</LinearLayout>
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:visibility="gone"
android:background="@android:color/holo_green_light"
android:focusable="true"
android:focusableInTouchMode="true"
android:id="@+id/check_view"
android:layout_alignBottom="@+id/rank_layout"
android:layout_alignTop="@+id/rank_layout">
<ImageView
android:layout_width="30dp"
android:layout_height="30dp"
android:foregroundGravity="top|right"
app:srcCompat="@drawable/check_ok"
android:id="@+id/check_image"
android:layout_marginLeft="4dp"
android:layout_marginRight="4dp"
android:layout_centerVertical="true"
android:layout_centerHorizontal="true" />
</RelativeLayout>
</RelativeLayout>
适配器
public class GridviewAdapter extends BaseAdapter {
Context c;
RelativeLayout RL;
ArrayList<criteria> Critere;
LayoutInflater inflater;
boolean clicked1=false;
boolean clicked2=false;
boolean clicked3=false;
boolean clicked4=false;
private int count = 0;
public GridviewAdapter(Context c, ArrayList<criteria> critere) {
this.c = c;
Critere = critere;
inflater = (LayoutInflater) c.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
}
@Override
public int getCount() {
return Critere.size();
}
@Override
public Object getItem(int position) {
return Critere.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View v;
LayoutInflater inflater = (LayoutInflater) c.getSystemService( c.LAYOUT_INFLATER_SERVICE);
v = inflater.inflate(R.layout.gridview_model, parent,false);
TextView nameTxt = v.findViewById(R.id.criteria_text);
ImageView image = v.findViewById(R.id.criteria_pic);
final RelativeLayout checked = v.findViewById(R.id.check_view);
final LinearLayout ranked = v.findViewById(R.id.rank_layout);
final String name = Critere.get(position).getName();
criteria cr = Critere.get(position);
nameTxt.setText(cr.getName());
PicassoClient.downloadImage(c, cr.getImageurl(),image);
final ImageButton btn1 = v.findViewById(R.id.btn1);
final ImageButton btn2 = v.findViewById(R.id.btn2);
final ImageButton btn3 = v.findViewById(R.id.btn3);
final ImageButton btn4 = v.findViewById(R.id.btn4);
btn1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(final View view) {
clicked1=true;
// inflate alert dialog xml
LayoutInflater li = LayoutInflater.from(c);
View dialogView = li.inflate(R.layout.custom_dialog_rank, null);
AlertDialog.Builder dialog = new AlertDialog.Builder(c);
dialog.setView(dialogView);
dialog.setIcon(R.drawable.btn_press_rank1);
dialog.setCancelable(false);
dialog.setTitle(R.string.crit1);
dialog.setMessage("The " + name + " was very unsatisfiying");
final EditText userInput = (EditText) dialogView
.findViewById(R.id.comment_field);
dialog.setPositiveButton(R.string.ok, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int id) {
checked.setVisibility(View.VISIBLE);
ranked.setVisibility(View.INVISIBLE);
}
})
.setNegativeButton(R.string.annuler, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
checked.setVisibility(View.GONE);
ranked.setVisibility(View.VISIBLE);
}
});
final AlertDialog alert = dialog.create();
alert.show();
}
});
btn2.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
clicked2=true;
// inflate alert dialog xml
LayoutInflater li = LayoutInflater.from(c);
View dialogView = li.inflate(R.layout.custom_dialog_rank, null);
AlertDialog.Builder dialog = new AlertDialog.Builder(c);
dialog.setIcon(R.drawable.btn_press_rank2);
dialog.setView(dialogView);
dialog.setCancelable(false);
dialog.setTitle(R.string.crit2);
dialog.setMessage("The " + name + " was unsatisfiying");
final EditText userInput = (EditText) dialogView
.findViewById(R.id.comment_field);
dialog.setPositiveButton(R.string.ok, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int id) {
checked.setVisibility(View.VISIBLE);
ranked.setVisibility(View.INVISIBLE);
}
})
.setNegativeButton(R.string.annuler, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
// alert.cancel();
checked.setVisibility(View.INVISIBLE);
ranked.setVisibility(View.VISIBLE);
}
});
final AlertDialog alert = dialog.create();
alert.show();
}
});
btn3.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
clicked3=true;
// inflate alert dialog xml
LayoutInflater li = LayoutInflater.from(c);
View dialogView = li.inflate(R.layout.custom_dialog_rank, null);
AlertDialog.Builder dialog = new AlertDialog.Builder(c);
dialog.setIcon(R.drawable.btn_press_rank4);
dialog.setView(dialogView);
dialog.setCancelable(false);
dialog.setTitle(R.string.crit3);
dialog.setMessage("The " + name + " was satisfiying");
final EditText userInput = (EditText) dialogView
.findViewById(R.id.comment_field);
dialog.setPositiveButton(R.string.ok, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int id) {
checked.setVisibility(View.VISIBLE);
ranked.setVisibility(View.INVISIBLE);
}
})
.setNegativeButton(R.string.annuler, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
// alert.cancel();
checked.setVisibility(View.INVISIBLE);
ranked.setVisibility(View.VISIBLE);
}
});
final AlertDialog alert = dialog.create();
alert.show();
}
});
btn4.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
clicked4=true;
// inflate alert dialog xml
LayoutInflater li = LayoutInflater.from(c);
View dialogView = li.inflate(R.layout.custom_dialog_rank, null);
AlertDialog.Builder dialog = new AlertDialog.Builder(c);
dialog.setIcon(R.drawable.btn_press_rank5);
dialog.setView(dialogView);
dialog.setCancelable(false);
dialog.setTitle(R.string.crit4);
dialog.setMessage("The " + name + " was very satisfiying");
final EditText userInput = (EditText) dialogView
.findViewById(R.id.comment_field);
dialog.setPositiveButton(R.string.ok, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int id) {
checked.setVisibility(View.VISIBLE);
ranked.setVisibility(View.INVISIBLE);
}
})
.setNegativeButton(R.string.annuler, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
// alert.cancel();
checked.setVisibility(View.INVISIBLE);
ranked.setVisibility(View.VISIBLE);
}
});
final AlertDialog alert = dialog.create();
alert.show();
}
});
return v;
}}
主要活动
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_criteria);
new CriteriaActivity.FetchCountTask().execute();
final GridView gv = (GridView) findViewById(R.id.gv);
toolbar = (Toolbar) findViewById(R.id.toolbar3);
setSupportActionBar(toolbar);
// get the references of buttons
btnSelectDate=(Button)findViewById(R.id.buttonSelectDate);
btnSelectTime=(Button)findViewById(R.id.buttonSelectTime);
// Set ClickListener on btnSelectDate
btnSelectDate.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
// Show the DatePickerDialog
showDialog(DATE_DIALOG_ID);
}
});
// Set ClickListener on btnSelectTime
btnSelectTime.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
// startFeedTime();
// Show the TimePickerDialog
showDialog(TIME_DIALOG_ID);
}
});
new Downloader_review(CriteriaActivity.this, urlAddress, gv).execute();
}
// Register DatePickerDialog listener
private DatePickerDialog.OnDateSetListener mDateSetListener =
new DatePickerDialog.OnDateSetListener() {
// the callback received when the user "sets" the Date in the DatePickerDialog
public void onDateSet(DatePicker view, int yearSelected,
int monthOfYear, int dayOfMonth) {
year = yearSelected;
month = monthOfYear + 1;
day = dayOfMonth;
// Set the Selected Date in Select date Button
btnSelectDate.setText("Date selected : "+day+"/"+month+"/"+year);
}
};
// Register TimePickerDialog listener
private TimePickerDialog.OnTimeSetListener mTimeSetListener =
new TimePickerDialog.OnTimeSetListener() {
// the callback received when the user "sets" the TimePickerDialog in the dialog
public void onTimeSet(TimePicker view, int hourOfDay, int min) {
hour = hourOfDay;
minute = min;
// Set the Selected Date in Select date Button
btnSelectTime.setText("Time selected : "+hour+":"+minute);
}
};
// Method automatically gets Called when you call showDialog() method
@Override
protected Dialog onCreateDialog(int id) {
switch (id) {
case DATE_DIALOG_ID:
// create a new DatePickerDialog with values you want to show
date = true;
DatePickerDialog dialog = new DatePickerDialog(this, mDateSetListener, mYear, mMonth, mDay);
dialog.getDatePicker().setMaxDate(System.currentTimeMillis());
return dialog;
// return new DatePickerDialog(this,
// mDateSetListener,
// mYear, mMonth, mDay);
// create a new TimePickerDialog with values you want to show
case TIME_DIALOG_ID:
time = true;
return new TimePickerDialog(this,
mTimeSetListener, mHour, mMinute, false);
}
return null;
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.main_menu, menu);
// Get the notifications MenuItem and
// its LayerDrawable (layer-list)
MenuItem item = menu.findItem(R.id.action_notifications);
LayerDrawable icon = (LayerDrawable) item.getIcon();
// BitmapDrawable iconBitmap = (BitmapDrawable) item.getIcon();
// LayerDrawable icon = new LayerDrawable(new Drawable [] { iconBitmap });
// Update LayerDrawable's BadgeDrawable
Utils.setBadgeCount(this, icon, mNotificationsCount);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
if (item.getItemId() == R.id.action_notifications) {
// TODO: display unread notifications.
return true;
}
return super.onOptionsItemSelected(item);
}
/*
Updates the count of notifications in the ActionBar.
*/
private void updateNotificationsBadge(int count) {
mNotificationsCount = count;
// force the ActionBar to relayout its MenuItems.
// onCreateOptionsMenu(Menu) will be called again.
invalidateOptionsMenu();
}
/**
* ATTENTION: This was auto-generated to implement the App Indexing API.
* See https://g.co/AppIndexing/AndroidStudio for more information.
*/
public Action getIndexApiAction() {
Thing object = new Thing.Builder()
.setName("Main Page") // TODO: Define a title for the content shown.
// TODO: Make sure this auto-generated URL is correct.
.setUrl(Uri.parse("http://[ENTER-YOUR-URL-HERE]"))
.build();
return new Action.Builder(Action.TYPE_VIEW)
.setObject(object)
.setActionStatus(Action.STATUS_TYPE_COMPLETED)
.build();
}
/*
Sample AsyncTask to fetch the notifications count
*/
class FetchCountTask extends AsyncTask<Void, Void, Integer> {
@Override
protected Integer doInBackground(Void... params) {
// example count. This is where you'd
// query your data store for the actual count.
return 5;
}
@Override
public void onPostExecute(Integer count) {
updateNotificationsBadge(count);
}
}
答案 0 :(得分:0)
尝试使用RecyclerView
代替GridView
。您可以使用StaggeredGridLayoutManager
获得相同的网格效果。此外,您将对每个项目拥有更多控制权