Member 13401395 Ответов: 1

Помощь с кодом для выделения результата поиска в виде списка


кто-нибудь может помочь мне изменить этот код, чтобы я мог получить выделенный результат поиска в ListView. Я все еще новичок в этом деле, поэтому больше не знаю, как это сделать. результат поиска уже отображается, но мне нужно сделать так, чтобы он выделял определенный символ или слово.
кто-нибудь может мне помочь, пожалуйста, я действительно застрял.
и я все еще использую Eclipse IDE, потому что на самом деле это мой старый проект, который я сделал до того, как google изменил официальную IDE для android на Android Studio. и с тех пор этот проект так и не был завершен.

Что я уже пробовал:

package com.artstudio.testhighlight;

import java.util.Locale;

import com.artstudio.testhighlight.DatabaseSong;

import android.os.Bundle;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.app.Activity;
import android.graphics.Color;
import android.graphics.Typeface;
import android.content.Context;
import android.content.res.ColorStateList;
import android.text.Editable;
import android.text.Spannable;
import android.text.SpannableString;
import android.text.TextWatcher;
import android.text.style.TextAppearanceSpan;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.inputmethod.InputMethodManager;
import android.widget.AdapterView;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;
import android.database.Cursor;    
import android.database.sqlite.SQLiteDatabase;

public class MainActivity extends Activity implements OnItemClickListener, TextWatcher {
	private ListView daftarLagu;
	private String[] tampungLaguLirik = null;
	protected static String strSearchLyric = null;  
	
	// Test Highlight
	private String mSearchText;
	
	 //deklarasi keperluan untuk database
    private SQLiteDatabase db = null;  
    private Cursor LaguCursor = null;  
    private DatabaseSong datalagu = null;  
    
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        
        datalagu = new DatabaseSong(this);  
		db = datalagu.openDataBase();
		db = datalagu.getReadableDatabase();
		datalagu.onCreate(db);
        
      //buat object dari dataLagu  
        
        setContentView(R.layout.activity_search);
        
        daftarLagu = (ListView)findViewById(R.id.listIndexLagu);
        
        //buat listener dari list view pada aplikasi pencarian tanaman obat
        daftarLagu.setOnItemClickListener(this);
        
      //Tombol Ganti Jenis Pencarian
        TextView text = (TextView) findViewById(R.id.pencarian);
        text.setText("PENCARIAN LIRIK LAGU");
 
   	 	Button nomorBtn = (Button) findViewById(R.id.btnSwitchPencarian);
	 	nomorBtn.setText("CARI NOMOR, JUDUL, PENGARANG");
	 	
        nomorBtn.setOnClickListener(new OnClickListener() {
        	@Override
            public void onClick(View v) {
        		finish();
        		db.close();
        		//startActivity(new Intent(MainActivity.this, SearchActivity.class));
            }
        });
        
      //Tombol Cari Lagu
        EditText textCari = (EditText)findViewById(R.id.editTextcari);
        textCari.setHint("Masukan Potongan Lirik Lagu");
        textCari.addTextChangedListener(this);
    }
    
  //buat overread method dari set on item click listener
	 public void onItemClick(AdapterView<?> arg0, View arg1, int posisi, long arg3) {
		 
		 Toast.makeText(MainActivity.this, "ini pas saya click", Toast.LENGTH_SHORT).show();
		 
			//Toast.makeText(SearchLyricActivity.this, ""+tampungLaguLirik[posisi], Toast.LENGTH_SHORT).show();
			//panggil method yang dibuat untuk handler tampilkan gambar dari data tanaman
			cariTampilView(""+tampungLaguLirik[posisi]);
			posisi = 0;
	 }
	 
	 
		//fungsi
		 public void cariTampilView(String cari){
			 LaguCursor = null;
			 //memilih lagu dari daftar
			 LaguCursor = db.rawQuery("SELECT lirik, nomor||'. '||judul "  
		                      + "FROM tbl_Lagusion WHERE (UPPER('\n\n___ '||nomor||'. '||judul)||'\n\n'||lirik) = '"+ cari +"' ", null);  
				if (LaguCursor.moveToFirst()) {  
					strSearchLyric = null;
					strSearchLyric = LaguCursor.getString(0); 
					Toast.makeText(MainActivity.this, LaguCursor.getString(1).toString(), Toast.LENGTH_SHORT).show();
		        	
		            //for (; !LaguCursor.isAfterLast(); LaguCursor.moveToNext()) {  
		            //	strSearchLyric = LaguCursor.getString(0); 	        	
		            //    }  
		        }  
		  
		        if (strSearchLyric.equals("")) {  	  
		        	strSearchLyric = "Terjemahan Not Found";  
		        	Toast.makeText(MainActivity.this, "Pencarian tidak ditemukan........!", Toast.LENGTH_SHORT).show();
					
		        }else{
		        	//hasil yang didapat dan di tampilkan ke frame_view
		        	Toast.makeText(MainActivity.this, "Sadisssssss\n"+LaguCursor.getString(0).toString(), Toast.LENGTH_SHORT).show();
		        	//Intent x = new Intent(MainActivity.this, LyricViewer.class);
		        	//startActivity(x);
		        }
		 }
		 
	void tampilLagu(){
		strSearchLyric = null;
		EditText text=(EditText)findViewById(R.id.editTextcari);
		text.setTextColor(Color.parseColor("#0066FF"));
		String value = text.getText().toString();
		int length = text.length();
		value = value.trim();
		value = value.replaceAll("'","’");
		//value = value.replaceAll(",","");
		
		if (length == 0){
        	value = null;
        }
		
		int Hitung =0;
		//Untuk menampilkan daftar lagu pada Index Lagu
	    LaguCursor = db.rawQuery("SELECT (UPPER('\n\n___ '||nomor||'. '||judul)||'\n\n'||lirik) FROM tbl_Lagusion WHERE lirik LIKE '%"+value+"%' ", null);  
	    
	        tampungLaguLirik = new String[LaguCursor.getCount()];
	        LaguCursor.moveToFirst();
	        Toast.makeText(MainActivity.this, "klot "+LaguCursor.getCount(), Toast.LENGTH_SHORT).show();
	        
	        for (int cc=0; cc < LaguCursor.getCount(); cc++)
	        {
	        	Hitung = Hitung +1;
	        	LaguCursor.moveToPosition(cc);
	        	tampungLaguLirik[cc] = LaguCursor.getString(0).toString();
	        }
	        
	        

	        if(Hitung == 0){
	        	daftarLagu = (ListView)findViewById(R.id.listIndexLagu);
		        daftarLagu.setFastScrollEnabled(true);
		        daftarLagu.setBackgroundColor(Color.TRANSPARENT);
		        daftarLagu.setAnimationCacheEnabled(true);
		        daftarLagu.setAdapter(new ArrayAdapter(this, android.R.layout.simple_list_item_1, tampungLaguLirik));
		        daftarLagu.setSelected(true);
		        
		        //daftarLagu..setTypeface(null, Typeface.BOLD);
	        	//pesanPengguna("Lagu Tidak Ditemukan!");
	        }else{
	        	daftarLagu = (ListView)findViewById(R.id.listIndexLagu);
	        	daftarLagu.setFastScrollEnabled(true);
	        	daftarLagu.setBackgroundColor(Color.TRANSPARENT);
	        	daftarLagu.setAnimationCacheEnabled(true);
	        	daftarLagu.setAdapter(new ArrayAdapter(this, android.R.layout.simple_list_item_1, tampungLaguLirik));
	        	daftarLagu.setSelected(true);
	        }
	        
	       
		}
	
    
	 private String getItem(int position) {
		// TODO Auto-generated method stub
		return null;
	}

	public void onBackPressed() {
		 strSearchLyric = null;
		 db.close();
	      finish();//memanggil method exit()
	 }
	 
		@Override
		public void afterTextChanged(Editable s) {
			// TODO Auto-generated method stub
			tampilLagu();
		}
		
		@Override
		public boolean dispatchTouchEvent(MotionEvent event) {
			
		    View v = getCurrentFocus();
		    boolean ret = super.dispatchTouchEvent(event);

		    if (v instanceof EditText) {
		        View w = getCurrentFocus();
		        int scrcoords[] = new int[2];
		        w.getLocationOnScreen(scrcoords);
		        float x = event.getRawX() + w.getLeft() - scrcoords[0];
		        float y = event.getRawY() + w.getTop() - scrcoords[1];
		       // Toast.makeText(MainActivity.this, "klot", Toast.LENGTH_SHORT).show();
		       // Log.d("Activity", "Touch event "+event.getRawX()+","+event.getRawY()+" "+x+","+y+" rect "+w.getLeft()+","+w.getTop()+","+w.getRight()+","+w.getBottom()+" coords "+scrcoords[0]+","+scrcoords[1]);
		        if (event.getAction() == MotionEvent.ACTION_UP && (x < w.getLeft() || x >= w.getRight() || y < w.getTop() || y > w.getBottom()) ) { 
		        //	Toast.makeText(MainActivity.this, "klot klot", Toast.LENGTH_SHORT).show();
		            InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
		            imm.hideSoftInputFromWindow(getWindow().getCurrentFocus().getWindowToken(), 0);
		        }
		    }
		return ret;
		}

		@Override
		public void beforeTextChanged(CharSequence s, int start, int count,
				int after) {
			// TODO Auto-generated method stub
		}

		@Override
		public void onTextChanged(CharSequence s, int start, int before,
				int count) {
			// TODO Auto-generated method stub
		}
}

David Crow

Задумывались ли вы о том, чтобы задать такой вопрос на самом форуме Android здесь, в CP? Этот раздел действительно предназначен для быстрых / коротких ответов.

Richard MacCutchan

Невозможно угадать, где ваша проблема во всем этом коде.

1 Ответов

Рейтинг:
1

Patrice T

Не решение вашего вопроса, а еще одна проблема, которая у вас есть.

LaguCursor = db.rawQuery("SELECT (UPPER('\n\n___ '||nomor||'. '||judul)||'\n\n'||lirik) FROM tbl_Lagusion WHERE lirik LIKE '%"+value+"%' ", null);

Никогда не создавайте SQL-запрос путем объединения строк. Рано или поздно вы сделаете это с помощью пользовательских вводов, и это откроет дверь уязвимости под названием "SQL injection", она опасна для вашей базы данных и подвержена ошибкам.
Одна кавычка в имени - и ваша программа рухнет. Если пользователь вводит имя типа "Брайан О'Коннер", это может привести к сбою вашего приложения, это уязвимость SQL-инъекции, и сбой-это наименьшая из проблем, вредоносный пользовательский ввод, и он продвигается к командам SQL со всеми учетными данными.
SQL-инъекция-Википедия[^]
SQL-инъекция[^]
Атаки SQL-инъекций на примере[^]
PHP: SQL Injection-руководство пользователя[^]
Шпаргалка по предотвращению инъекций SQL-OWASP[^]


David Crow

Это должен был быть комментарий, а не решение.

Patrice T

Спасибо за комментарий, по крайней мере, вы скажете свое мнение, у большинства даунвотеров нет такой смелости.
Я не согласен с вами, я думаю, что "SQL-инъекция" - это реальная проблема, и советовать об этом стоит, даже если это не вопрос OP.

David Crow

1) я ничего не" понижал".
2) я ни разу не сказал и даже не намекнул, что SQL-инъекция не является проблемой. У ОП была проблема с поиском в ListView Вы прокомментировали что-то совершенно другое, но отметили свой комментарий как решение. Вот с чем я был не согласен.

Patrice T

-Я ничего не "понижал".
Я этого не говорил.
- Вы говорили о чем-то совершенно другом, но отметили свой комментарий как решение. Вот с чем я был не согласен.
Я принимаю это к сведению.