Я хочу показать мою конкретную папку vedios в макете GridView.
Но я получаю черные элементы в макете GridView Снимок экрана, показывающий макет GridView
Это мой класс для получения данных из внутренней памяти.
public class Spacecraft {
String name;
boolean Checked=false;
private Uri uri;;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Uri getUri() {
return uri;
}
public void setUri(Uri uri) {
this.uri = uri;
}
public boolean isChecked(){
return Checked;
}
public void toggleChecked(){
Checked = !Checked;
}
}
Это мой Adapter Class.
public class VedioAdapter extends BaseAdapter {
Context c;
ArrayList<Spacecraft> spacecrafts;
public VedioAdapter(Context c, ArrayList<Spacecraft> spacecrafts) {
this.c = c;
this.spacecrafts = spacecrafts;
}
@Override
public int getCount() {
return spacecrafts.size();
}
@Override
public Object getItem(int i) {
return spacecrafts.get(i);
}
@Override
public long getItemId(int i) {
return i;
}
@Override
public View getView(int i, View view, ViewGroup viewGroup) {
if (view==null)
{
//INFLATE CUSTOM LAYOUT
view= LayoutInflater.from(c).inflate(R.layout.whatsapp_vedio,viewGroup,false);
}
final Spacecraft s= (Spacecraft) this.getItem(i);
if (s.isChecked()){
view.setBackgroundColor(Color.parseColor("#06ad94"));
}
else view.setBackgroundColor(Color.TRANSPARENT);
// TextView nameTxt= (TextView) view.findViewById(R.id.textView);
VideoView vedio=(VideoView)view.findViewById(R.id.vedio);
vedio.setVideoURI(s.getUri());
//BIND DATA
// nameTxt.setText(s.getName());
return view;
}
}
Это мой класс активности VedioLayout.
public class VedioGrid extends AppCompatActivity {
Spacecraft s;
ArrayList<Spacecraft> list = new ArrayList<>();
ArrayList<Spacecraft> list_items = new ArrayList<>();
int count = 0;
public ArrayList<Spacecraft> getPlayList(String rootPath) {
ArrayList<Spacecraft> fileList = new ArrayList<>();
try {
File rootFolder = new File(rootPath);
File[] files = rootFolder.listFiles(); //here you will get NPE if directory doesn't contains any file,handle it like this.
for (File file : files) {
if (file.isDirectory()) {
if (getPlayList(file.getAbsolutePath()) != null) {
fileList.addAll(getPlayList(file.getAbsolutePath()));
} else {
break;
}
} else if (file.getName().endsWith(".mp4")) {
s = new Spacecraft();
s.setName(file.getName());
s.setUri(Uri.fromFile(file));
fileList.add(s);
}
}
return fileList;
} catch (Exception e) {
return null;
}
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.images);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
String path = Environment.getExternalStorageDirectory().getAbsolutePath().toString() + "/and/";
list = getPlayList(path);
GridView gv = (GridView) findViewById(R.id.simpleGridView);
final VedioAdapter adapter = new VedioAdapter(this, list);
gv.setAdapter(adapter);
gv.setChoiceMode(GridView.CHOICE_MODE_MULTIPLE_MODAL);
gv.setMultiChoiceModeListener(new AbsListView.MultiChoiceModeListener() {
@Override
public void onItemCheckedStateChanged(ActionMode mode, int position, long id, boolean checked) {
Spacecraft s = list.get(position);
s.toggleChecked();
if (s.isChecked()) {
adapter.notifyDataSetChanged();
count = count + 1;
mode.setTitle(count + " Deleted Items");
list_items.add(s);
} else {
if (count != 0) {
adapter.notifyDataSetChanged();
count = count - 1;
mode.setTitle(count + " Deleted Items");
list_items.remove(s);
}
}
}
@Override
public boolean onCreateActionMode(ActionMode mode, Menu menu) {
MenuInflater inflater = mode.getMenuInflater();
inflater.inflate(R.menu.menu_main, menu);
return true;
}
@Override
public boolean onPrepareActionMode(ActionMode mode, Menu menu) {
return false;
}
@Override
public boolean onActionItemClicked(ActionMode mode, MenuItem item) {
final ActionMode mod = mode;
switch (item.getItemId()) {
case R.id.action_open:
new AlertDialog.Builder(VedioGrid.this)
.setIcon(android.R.drawable.ic_dialog_alert)
.setTitle("Are you sure?")
.setMessage("Do you want to delete this image?")
.setPositiveButton("Yes", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int p) {
int i;
for (i = 0; i < list_items.size(); ++i) {
Spacecraft s1 = list_items.get(i);
File f = new File(s1.getUri().getPath());
Boolean deleted = f.delete();
VedioGrid.this.sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, Uri.fromFile(new File(s1.getUri().getPath()))));
if (deleted == true) {
list.remove(s1);
adapter.notifyDataSetChanged();
}
}
list_items.clear();
Toast.makeText(VedioGrid.this, count + "Deleted", Toast.LENGTH_SHORT).show();
count = 0;
mod.finish();
}
})
.setNegativeButton("No", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
dialogInterface.cancel();
}
})
.show();
return true;
default:
return false;
}
}
@Override
public void onDestroyActionMode(ActionMode mode) {
}
});
gv.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
Spacecraft s = list.get(position);
Toast.makeText(getApplicationContext(), s.getName(), Toast.LENGTH_SHORT).show();
}
});
}
@Override
public boolean onSupportNavigateUp() {
onBackPressed();
return true;
}
}
Я не получаю видео в макете, и даже если я попытаюсь выбрать несколько элементов, в действии ничего не произойдет. Я что не так делаю?
Я использую
gv.setChoiceMode(GridView.CHOICE_MODE_MULTIPLE_MODAL);
gv.setMultiChoiceModeListener(new AbsListView.MultiChoiceModeListener()
но ничего не происходит. Раньше я пробовал это для извлечения изображений из внутренней памяти. Я получаю желаемый результат и могу выбирать элементы, но здесь я использую ту же логику для извлечения видео и отображения в макете GridView, но не получаю результата. Я получаю черные предметы, как показано на скриншоте выше, и не могу их выбрать. Пожалуйста, помоги мне.
Да, я добавил разрешения на чтение и запись, и я использую compiledsdk версии 27.1.1 и минимальную версию SDK 15. Все отлично работает при извлечении изображений, но для vedios я не получаю результата. Нужно ли мне использовать просмотр изображений для показа миниатюр vedio, потому что я хочу показывать только видео, чтобы не воспроизводить его
а на каком устройстве вы это тестируете?
Я использую версию Android 6.0.1 в Le eco Le2. Мне нужно использовать просмотр изображений для отображения миниатюр vedio, потому что я хочу показывать только vedio, чтобы не воспроизводить его
Думаю, это может решить вашу проблему: stackoverflow.com/questions/32517124/…
Привет, спасибо, проблема решена, но в gridviewlayout он работает очень медленно. Когда я прокручиваю или выбираю элементы, которые требуют времени, вы можете помочь, пожалуйста, как его улучшить.
используйте фоновый поток или AsyncTask для заполнения списка
Вы добавили разрешение в manifest.xml? а если добавлено, какую версию андроида вы используете?