gpt4 book ai didi

java - ListView 项目在滚动后保持突出显示

转载 作者:行者123 更新时间:2023-11-29 04:57:55 26 4
gpt4 key购买 nike

我的应用程序中有一个 ListView ,如果我单击列表中的一项,它会突出显示。然后,如果我单击另一个项目,该突出显示将转移到该项目。但是,如果在选择一个项目后滚动列表,然后从列表的另一部分选择另一个项目,它们都会保持突出显示。但如果我不滚动屏幕就不会。是什么原因造成的?又该如何处理?

ListAdapter.java

package com.example.mp3;



import java.util.List;
import android.content.Context;
import android.content.SharedPreferences;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.TextView;

public class ListAdapter extends BaseAdapter{

private Context _context;
private List<String> list;

public ListAdapter(Context _context,List<String> list)
{
this._context=_context;
this.list=list;
}
@Override
public int getCount() {
// TODO Auto-generated method stub
return list.size();
}

@Override
public Object getItem(int arg0) {
// TODO Auto-generated method stub
return list.get(arg0);
}

@Override
public long getItemId(int arg0) {
// TODO Auto-generated method stub
return arg0;
}
@Override

public int getViewTypeCount() {

return getCount();
}

@Override

public int getItemViewType(int position) {

return position;
}


@Override
public View getView(int position, View convertView, ViewGroup viewGroup) {
// TODO Auto-generated method stub

View row = convertView;
if (convertView == null) {
LayoutInflater inflater = (LayoutInflater) _context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
row = inflater.inflate(R.layout.simplerow, viewGroup, false);
}


TextView textView = (TextView) row.findViewById(R.id.rowTextView);
textView.setText(list.get(position).toString());



return row;
}



}

主 Activity .java

package com.example.mp3;


import java.io.File;
import java.io.IOException;
import java.util.ArrayList;

import android.app.ActionBar;
import android.app.Activity;
import android.app.SearchManager;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.graphics.Color;
import android.graphics.drawable.ColorDrawable;
import android.media.MediaPlayer;
import android.media.MediaPlayer.OnCompletionListener;
import android.net.Uri;
import android.os.Bundle;
import android.os.Environment;
import android.preference.PreferenceManager;

import android.support.v4.view.MenuItemCompat;
import android.support.v4.view.MenuItemCompat.OnActionExpandListener;
import android.text.Html;
import android.util.Log;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;

import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ImageButton;
import android.widget.ListView;
import android.widget.SearchView;
import android.widget.TextView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.Toast;


public class MainActivity extends Activity implements View.OnClickListener, OnCompletionListener {

ListView list;
ArrayAdapter<String> adapter ;
ArrayList<String> listTest;
ArrayList<String> listSoundNames;
ImageButton play,stop,back,next;
String songpath,song,title;
int index,current_position;
File[] listFile;
SharedPreferences sharedPref;
MediaPlayer mp,mp2;
ActionBar bar;
private Boolean state=false;
private static int save = -1;
int count=0;
private static final String TAG = MainActivity.class.getSimpleName();
private Context _context = this;


@Override
protected void onCreate(Bundle savedInstanceState) {



super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

sharedPref = PreferenceManager.getDefaultSharedPreferences(getApplicationContext());
song = sharedPref.getString("songname", "name");

mp=new MediaPlayer();
mp2 = new MediaPlayer();

mp.setOnCompletionListener(this);


list = (ListView)findViewById(R.id.list);
//list.setChoiceMode(ListView.CHOICE_MODE_SINGLE);

_context=this;





listTest = new ArrayList<String>( );
listSoundNames=new ArrayList<String>();

play = (ImageButton)findViewById(R.id.play);
back = (ImageButton)findViewById(R.id.prev);
next = (ImageButton)findViewById(R.id.next);

//adding listeners
play.setOnClickListener(this);
back.setOnClickListener(this);
next.setOnClickListener(this);


//action bar controls
bar = getActionBar();
bar.setBackgroundDrawable(new ColorDrawable(Color.parseColor("#DF0174")));
//bar.setIcon(new ColorDrawable(getResources().getColor(android.R.color.transparent)));

EditText editText = new EditText(getApplicationContext());
getActionBar().setCustomView(editText);


//bar.setDisplayShowTitleEnabled(true);
//bar.setDisplayHomeAsUpEnabled(true);

Scanner("/sdcard/");///storage path


/////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////*Adding listener to songs*//////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////

if(listTest.size() != 0)
{
//listAdapter = new ArrayAdapter<String> (MainActivity.this,R.layout.simplerow, listSoundNames);

ListAdapter listAdapter=new ListAdapter(_context,listSoundNames);
list.setAdapter(listAdapter);
list.setOnItemClickListener(new OnItemClickListener()
{
public void onItemClick(AdapterView<?> parent, View view, int position, long id)
{
///////////////////changing list item background on click///////////////////

list.clearChoices();
//list.setSelection(position);
view.setSelected(true); ///////////////////PROBLEM/////////////

for(int a = 0; a < parent.getChildCount(); a++)
{

parent.getChildAt(a).setBackgroundColor(Color.BLACK);


}


view.setBackgroundColor(Color.RED);


////////////////////////////////////////////////////////////////////////////
//accessing song path
String selected = listTest.get(position);
list.setItemChecked(position, true);//

//accessing the song name
String name = (String) ((TextView) view).getText();
title = name;
//bar.setTitle(title);
//Log.e(TAG, name);

Toast.makeText(getApplicationContext(), name, Toast.LENGTH_SHORT).show();
try{
mp.reset();
mp.setDataSource(listTest.get(position));//source
mp.prepare();
mp.start();
index = position;
play.setImageResource(R.drawable.pause);
}
catch(Exception e){e.printStackTrace();}



}


});




}

}



////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////*Songs added here to list*////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////

private void Scanner(String path) {
// TODO Auto-generated method stub
{
try
{
File fl = new File(path);
File[] listOfFiles = fl.listFiles();

for (File listOfFile : listOfFiles)
{
String s = listOfFile.getName();

if(s.endsWith(".mp3"))
{

songpath = listOfFile.getPath();
listTest.add(songpath);//adding song names to list
//listTest.toString().replaceFirst(songpath, s);



// store file name in listSoundNames
int pos = s.lastIndexOf(".");
if (pos > 0)
{
song = s.substring(0, pos);
}
listSoundNames.add(song);

}


/////////////////////////////////
File f = new File(path+s+"/");
if (f.exists() && f.isDirectory()) {
Scanner(path+s+"/");
}
////////////////////////////////


}



}
catch (Exception e) { }
}

}








@Override
public void onClick(View v) {
// TODO Auto-generated method stub

if (v.equals(play))
{
if(mp.isPlaying())
{
mp.pause();
Toast.makeText(MainActivity.this, "paused", Toast.LENGTH_SHORT).show();
//change in button image//
play.setImageResource(R.drawable.play);

}
else
{
mp.start();
Toast.makeText(MainActivity.this, "started", Toast.LENGTH_SHORT).show();
//change in button image//
play.setImageResource(R.drawable.pause);
//
}
}


if (v.equals(back))
{
mp.stop();
mp.reset();
//bar.setTitle(song);
if(index!=0)
{
index = index -1;
}
else
{
index = (list.getAdapter().getCount()-1)-1;

}

Uri uri = Uri.parse(listTest.get(index).toString());//getting the path of next song
try {


mp.setDataSource(getApplicationContext(), uri);//setting new data source


} catch (IllegalArgumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SecurityException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalStateException e) {
// TODO Auto-generated catch block
e.printStackTrace();
Toast.makeText(MainActivity.this, "ERROR", Toast.LENGTH_SHORT).show();///PROBLEM:MOVING HERE AFTER CLICKING NEXT BUTTON
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

try {
mp.prepare();
} catch (IllegalStateException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
mp.start();//PROBLEM: NOT PLAYING
Toast.makeText(MainActivity.this, ""+uri, Toast.LENGTH_SHORT).show();

}


if (v.equals(next))
{

mp.stop();
mp.reset();
index = index +1;


Uri uri = Uri.parse(listTest.get(index).toString());//getting the path of next song

try {


mp.setDataSource(getApplicationContext(), uri);//setting new data source


} catch (IllegalArgumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SecurityException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalStateException e) {
// TODO Auto-generated catch block
e.printStackTrace();
Toast.makeText(MainActivity.this, "ERROR", Toast.LENGTH_SHORT).show();///PROBLEM:MOVING HERE AFTER CLICKING NEXT BUTTON
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

try {
mp.prepare();
} catch (IllegalStateException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
mp.start();//PROBLEM: NOT PLAYING
Toast.makeText(MainActivity.this, ""+uri, Toast.LENGTH_SHORT).show();


}


}


@Override
public void onCompletion(MediaPlayer arg0) {
// TODO Auto-generated method stub
play.setImageResource(R.drawable.play);
}

/*@Override
protected void onStop() {
super.onStop();
mp.stop();
Toast.makeText(getApplicationContext(), "stopped", Toast.LENGTH_LONG).show();

}*/

//////////////////////////////////////////Search box/////////////////////////////////////////////////////

@Override
public boolean onCreateOptionsMenu(Menu menu) {
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.main, menu);



SearchManager searchManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE);
SearchView searchView = (SearchView) menu.findItem(R.id.action_search).getActionView();

searchView.setSearchableInfo(searchManager.getSearchableInfo(getComponentName()));
searchView.setIconifiedByDefault(false);
searchView.setQueryHint(Html.fromHtml(("<font color = #ffffff>"+"Listen Now"+"</font>")));



SearchView.OnQueryTextListener textChangeListener = new SearchView.OnQueryTextListener()
{
@Override
public boolean onQueryTextChange(String newText)
{
// this is your adapter that will be filtered
adapter.getFilter().filter(newText);

Toast.makeText(getApplicationContext(), "type"+newText, Toast.LENGTH_SHORT).show();
return true;
}
@Override
public boolean onQueryTextSubmit(String query)
{
// this is your adapter that will be filtered
adapter.getFilter().filter(query);

//Toast.makeText(getApplicationContext(), query, Toast.LENGTH_SHORT).show();

try
{
File fl = new File("/sdcard/");
File[] listOfFiles = fl.listFiles();
String selectedPath="";

for (File listOfFile : listOfFiles)
{
String s = listOfFile.getName();

if(s.equalsIgnoreCase(query) && s.endsWith(".mp3"))
{

selectedPath= listOfFile.getPath();//not receiving the path:PROBLEM:HOLDING THE POSITION FOR LIST ITEM


//listTest.add(songpath);//adding song names to list
//listTest.toString().replaceFirst(songpath, s);
Toast.makeText(getApplicationContext(), listOfFile.getPath(), Toast.LENGTH_SHORT).show();

/*mp.setDataSource(selectedPath);
mp.prepare();
mp.start();*/

}



/////////////////////////////////
File f = new File("/sdcard/"+s+"/");
if (f.exists() && f.isDirectory()) {
Scanner("/sdcard/"+s+"/");
}
////////////////////////////////


}



}

catch (Exception e) { }

return true;
}
};
searchView.setOnQueryTextListener(textChangeListener);



return super.onCreateOptionsMenu(menu);

}


}

最佳答案

导致此问题的原因是 Android 回收 ListView 项目的方式。防止发生这种情况的一种方法是手动保存单击的项目。在您的适配器中,您可以创建一个变量来保存当前选定的项目。在您的 getView 中,您必须检查当前项目是否与所选项目相同。它看起来像这样:

if(row==currentSelected){
//设置背景颜色
别的{
//另一种背景颜色 -> 这很重要,否则所有 ListView 项目在上下滑动后将具有相同的背景颜色
}

关于java - ListView 项目在滚动后保持突出显示,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33081519/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com