我有一个 ListView 包含 RatingBar 来指示某些内容,如果您单击 LisView 的项目,它会弹出一个包含 RatingBar 的对话框(AlertDialog),现在我想知道:
- 如何自定义对话框中显示的 RatingBar(下面的代码不起作用,我认为是由于final导致无法自定义)。
- 如何将评分从 Dialog RatingBar 传递到 ListView RatingBar。
我目前的代码是:
final RatingBar ratingBar = new RatingBar(getApplicationContext());
ratingBar.setRating(0);
ratingBar.setStepSize(1);
ratingBar.setNumStars(2);
builder.setTitle(R.string.alertdialog_title)
.setIcon(android.R.drawable.ic_dialog_info)
.setView(ratingBar)
.setPositiveButton("Submit", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
// do something.
}
})
.setNegativeButton("Cancel", null);
Edit1
我已经使用 fileListAdapter(FileListAdapter 的一个实例作为code1)显示了 listview 项目的评级。现在的问题是:
- 单击对话框后评级发生变化,但不是我单击的项目,如何将项目与评级(在对话框上)更改 映射。
- 如何存储评分,每次ListView刷新,评分就消失了。
我已将 onItemClickListener 上的对话框代码作为code2。
代码1:
public class FileListAdapter extends BaseAdapter {
private Context context;
private ArrayList<File> files; // The ArrayList to store the files
private boolean isSDcard; // To indicate whether the file is the SDcard
private LayoutInflater mInflater; // The LayoutInflater
public FileListAdapter (Context context, ArrayList<File> files, boolean isSDcard) {
this.context = context;
this.files = files;
this.isSDcard = isSDcard;
mInflater = LayoutInflater.from(context);
}
@Override
public int getCount () {
return files.size();
}
@Override
public Object getItem (int position) {
return files.get(position);
}
@Override
public long getItemId (int position) {
return position;
}
@Override
public View getView (int position, View convertView, ViewGroup parent) {
ViewHolder viewHolder;
/**
* The view is not initialized,initialize the view according to the layout file,
* and bind it to tag.
*/
if(convertView == null) {
viewHolder = new ViewHolder();
convertView = mInflater.inflate(R.layout.file_list_item, null); // Inflate from the layout file
convertView.setTag(viewHolder);
viewHolder.file_title = (TextView) convertView.findViewById(R.id.file_title); // Find the file_title textview
viewHolder.file_icon = (ImageView) convertView.findViewById(R.id.file_icon); // Find the file_icon imageview
viewHolder.file_path = (TextView) convertView.findViewById(R.id.file_path); // Find the file_path textview
viewHolder.encrypt_level = (RatingBar) convertView.findViewById(R.id.encrypt_level); // Find the rating_bar view
} else {
viewHolder = (ViewHolder) convertView.getTag();
}
File file = (File) getItem(position);
if(position == 0 && !isSDcard) { // Add the back to SDcard item
viewHolder.file_title.setText(R.string.back_to_sdcard);
viewHolder.file_icon.setImageResource(R.drawable.sdcard_icon);
viewHolder.file_path.setText(Environment.getExternalStorageDirectory().toString());
viewHolder.encrypt_level.setRating(0);
}
if(position == 1 && !isSDcard) { // Add the back to parent item
viewHolder.file_title.setText(R.string.back_to_parent);
viewHolder.file_icon.setImageResource(R.drawable.folder_up_icon);
viewHolder.file_path.setText(file.getPath());
viewHolder.encrypt_level.setRating(0);
} else { // The current filepath is the SDcard or the position is neither 0 nor 1
String fileName = file.getName();
viewHolder.file_title.setText(fileName);
viewHolder.file_path.setText(file.getPath());
viewHolder.encrypt_level.setRating(0);
if(file.isDirectory()) { // The variable file is a directory
viewHolder.file_icon.setImageResource(R.drawable.folder_icon);
} else { // The variable file is a file
viewHolder.file_icon.setImageResource(R.drawable.file_icon);
}
}
return convertView;
}
private class ViewHolder {
private ImageView file_icon; // The icon of the file
private TextView file_title; // The title of the file
private TextView file_path; // The path of the file
private RatingBar encrypt_level; // The encrypt level of the file
}
}
代码2:
final Dialog rankDialog = new Dialog(MainActivity.this, R.style.FullHeightDialog);
rankDialog.setContentView(R.layout.rank_dialog);
rankDialog.setCancelable(true);
final RatingBar ratingBar = (RatingBar)rankDialog.findViewById(R.id.dialog_ratingbar);
TextView text = (TextView) rankDialog.findViewById(R.id.rank_dialog_text1);
text.setText("Set Rating!");
Button updateButton = (Button) rankDialog.findViewById(R.id.rank_dialog_button);
updateButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Log.d(Tag, ratingBar.getRating() + "");
RatingBar ratebar = (RatingBar) findViewById(R.id.encrypt_level); // The RatingBar in the ListView.
ratebar.setRating(ratingBar.getRating()); // Change the rating.
rankDialog.dismiss();
}
});
rankDialog.show();